Объект зависит от объекта, который зависит от объекта - MySQL

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. По голове не бить - тему создал не сразу, как появилась проблема, а после многочасового интернет-серфинга, просмотра тем на форумах и чтения литературы. Тем на форумах по данному вопросу очень много, но нужного ответа я не нашел.

Вступление

Я новичок в IT-сфере, а уж в базах данных - тем более. При проектировке возникают вопросы: а какое максимальное количество таблиц можно сделать? Строк? Столбцов? И так далее. Пример ситуации ниже

К делу

Расскажу на примере умного дома. Есть пользователи, у пользователей есть комнаты, в комнатах есть приборы, а у приборов есть свои MAC-адреса.

Вопрос на миллиард:

как мне занести все эти данные в базу данных? Я понимаю, что делать таблицу для каждого пользователя - это "колхоз". Но как сделать по-другому - не представляю.

Попытки

Хотел внести всё в одну таблицу. Столбец - пользователь, столбец - список всех комнат, столбец - список всех приборов и т.д. Но проблема в том, что я не могу все приборы и все MAC-и занести в две ячейки, потому что у каждого прибора свой MAC. И как быть? Если делать 1 таблица = 1 пользователь, то какое максимальное количество таблиц возможно? Как бы пользователей пока 0 и будут расти они ооочень медленно. Можно сделать пока для каждого свою таблицу, но а что делать потом. Думаю об этом заранее, и решения пока не нахожу(
Забыл написать главное - мне нужно не просто все это занести (так бы я не парился), а еще делать выборки. Причем очень часто. Т.е. по MAC найти прибор, или же по комнате найти все приборы в ней и т.д.

Решение задачи: «Объект зависит от объекта, который зависит от объекта»

textual
Листинг программы
  1. CREATE TABLE `users` (
  2.     `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор пользователя',
  3.     `name` VARCHAR(255) NOT NULL COMMENT 'Имя пользователя',
  4.     PRIMARY KEY (`id`)
  5. )
  6. COMMENT='Таблица с пользователями'
  7. COLLATE='utf8_general_ci'
  8. ENGINE=InnoDB;
  9.  
  10. CREATE TABLE `rooms` (
  11.     `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор комнаты',
  12.     `id_user` INT(10) UNSIGNED NOT NULL COMMENT 'Идентификатор пользователя',
  13.     `name` VARCHAR(255) NOT NULL COMMENT 'Название комнаты',
  14.     PRIMARY KEY (`id`),
  15.     INDEX `FK__users` (`id_user`),
  16.     CONSTRAINT `FK__users` FOREIGN KEY (`id_user`) REFERENCES `users` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
  17. )
  18. COMMENT='Таблица с комнатами'
  19. COLLATE='utf8_general_ci'
  20. ENGINE=InnoDB;
  21.  
  22. CREATE TABLE `devices` (
  23.     `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор прибора',
  24.     `id_room` INT(10) UNSIGNED NOT NULL COMMENT 'Идентификатор комнаты',
  25.     `name` VARCHAR(255) NOT NULL COMMENT 'Название прибора',
  26.     `mac` CHAR(12) NOT NULL COMMENT 'MAC-адрес',
  27.     PRIMARY KEY (`id`),
  28.     INDEX `FK__rooms` (`id_room`),
  29.     CONSTRAINT `FK__rooms` FOREIGN KEY (`id_room`) REFERENCES `rooms` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
  30. )
  31. COMMENT='Таблица с приборами'
  32. COLLATE='utf8_general_ci'
  33. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы