Объект зависит от объекта, который зависит от объекта - MySQL
Формулировка задачи:
Всем доброго времени суток. По голове не бить - тему создал не сразу, как появилась проблема, а после многочасового интернет-серфинга, просмотра тем на форумах и чтения литературы. Тем на форумах по данному вопросу очень много, но нужного ответа я не нашел.
Вступление
Я новичок в IT-сфере, а уж в базах данных - тем более. При проектировке возникают вопросы: а какое максимальное количество таблиц можно сделать? Строк? Столбцов? И так далее. Пример ситуации нижеК делу
Расскажу на примере умного дома. Есть пользователи, у пользователей есть комнаты, в комнатах есть приборы, а у приборов есть свои MAC-адреса.Вопрос на миллиард:
как мне занести все эти данные в базу данных? Я понимаю, что делать таблицу для каждого пользователя - это "колхоз". Но как сделать по-другому - не представляю.Попытки
Хотел внести всё в одну таблицу. Столбец - пользователь, столбец - список всех комнат, столбец - список всех приборов и т.д. Но проблема в том, что я не могу все приборы и все MAC-и занести в две ячейки, потому что у каждого прибора свой MAC. И как быть? Если делать 1 таблица = 1 пользователь, то какое максимальное количество таблиц возможно? Как бы пользователей пока 0 и будут расти они ооочень медленно. Можно сделать пока для каждого свою таблицу, но а что делать потом. Думаю об этом заранее, и решения пока не нахожу(
Забыл написать главное - мне нужно не просто все это занести (так бы я не парился), а еще делать выборки. Причем очень часто. Т.е. по MAC найти прибор, или же по комнате найти все приборы в ней и т.д.
Решение задачи: «Объект зависит от объекта, который зависит от объекта»
textual
Листинг программы
CREATE TABLE `users` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор пользователя', `name` VARCHAR(255) NOT NULL COMMENT 'Имя пользователя', PRIMARY KEY (`id`) ) COMMENT='Таблица с пользователями' COLLATE='utf8_general_ci' ENGINE=InnoDB; CREATE TABLE `rooms` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор комнаты', `id_user` INT(10) UNSIGNED NOT NULL COMMENT 'Идентификатор пользователя', `name` VARCHAR(255) NOT NULL COMMENT 'Название комнаты', PRIMARY KEY (`id`), INDEX `FK__users` (`id_user`), CONSTRAINT `FK__users` FOREIGN KEY (`id_user`) REFERENCES `users` (`id`) ON UPDATE CASCADE ON DELETE CASCADE ) COMMENT='Таблица с комнатами' COLLATE='utf8_general_ci' ENGINE=InnoDB; CREATE TABLE `devices` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор прибора', `id_room` INT(10) UNSIGNED NOT NULL COMMENT 'Идентификатор комнаты', `name` VARCHAR(255) NOT NULL COMMENT 'Название прибора', `mac` CHAR(12) NOT NULL COMMENT 'MAC-адрес', PRIMARY KEY (`id`), INDEX `FK__rooms` (`id_room`), CONSTRAINT `FK__rooms` FOREIGN KEY (`id_room`) REFERENCES `rooms` (`id`) ON UPDATE CASCADE ON DELETE CASCADE ) COMMENT='Таблица с приборами' COLLATE='utf8_general_ci' ENGINE=InnoDB;
Объяснение кода листинга программы
- Создание таблицы
users
с полямиid
,name
иPRIMARY KEY
- Создание таблицы
rooms
с полямиid
,id_user
,name
,PRIMARY KEY
,INDEX
иCONSTRAINT
- Создание таблицы
devices
с полямиid
,id_room
,name
,mac
,PRIMARY KEY
,INDEX
иCONSTRAINT
- Вставка комментариев в каждую таблицу
- Использование типа данных
INT(10) UNSIGNED
для полейid
в каждой таблице - Использование типа данных
VARCHAR(255)
для полейname
в каждой таблице - Использование типа данных
CHAR(12)
для поляmac
в таблицеdevices
- Установка значения
NOT NULL
для каждого поля в каждой таблице - Использование
AUTO_INCREMENT
для поляid
в каждой таблице - Использование
COMMENT
для добавления комментариев к таблицам и полям - Использование
COLLATE
для установки кодировки таблицыusers
- Использование
ENGINE
для указания используемого движка базы данных для каждой таблицы - Создание индекса
FK__rooms
для связи таблицrooms
иdevices
- Создание ограничения внешнего ключа
CONSTRAINT
для связи таблицrooms
иdevices
- Использование
ON UPDATE CASCADE
иON DELETE CASCADE
для управления действиями при изменении и удалении записей в связанных таблицах - Использование
REFERENCES
для указания связанной таблицы в ограничении внешнего ключа - Использование
INDEX
для создания индекса на полеid_user
в таблицеdevices
- Использование
PRIMARY KEY
для указания первичного ключа в каждой таблице - Использование
INT(10) UNSIGNED
для поляid_user
в таблицеdevices
- Использование
VARCHAR(255)
для поляname
в таблицеdevices
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д