Объект зависит от объекта, который зависит от объекта - 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;

Объяснение кода листинга программы

  1. Создание таблицы users с полями id, name и PRIMARY KEY
  2. Создание таблицы rooms с полями id, id_user, name, PRIMARY KEY, INDEX и CONSTRAINT
  3. Создание таблицы devices с полями id, id_room, name, mac, PRIMARY KEY, INDEX и CONSTRAINT
  4. Вставка комментариев в каждую таблицу
  5. Использование типа данных INT(10) UNSIGNED для полей id в каждой таблице
  6. Использование типа данных VARCHAR(255) для полей name в каждой таблице
  7. Использование типа данных CHAR(12) для поля mac в таблице devices
  8. Установка значения NOT NULL для каждого поля в каждой таблице
  9. Использование AUTO_INCREMENT для поля id в каждой таблице
  10. Использование COMMENT для добавления комментариев к таблицам и полям
  11. Использование COLLATE для установки кодировки таблицы users
  12. Использование ENGINE для указания используемого движка базы данных для каждой таблицы
  13. Создание индекса FK__rooms для связи таблиц rooms и devices
  14. Создание ограничения внешнего ключа CONSTRAINT для связи таблиц rooms и devices
  15. Использование ON UPDATE CASCADE и ON DELETE CASCADE для управления действиями при изменении и удалении записей в связанных таблицах
  16. Использование REFERENCES для указания связанной таблицы в ограничении внешнего ключа
  17. Использование INDEX для создания индекса на поле id_user в таблице devices
  18. Использование PRIMARY KEY для указания первичного ключа в каждой таблице
  19. Использование INT(10) UNSIGNED для поля id_user в таблице devices
  20. Использование VARCHAR(255) для поля name в таблице devices

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы