2016-06-17 2 views
0

У меня есть список «бытовых приборов», и я хочу смоделировать базу данных, чтобы сохранить их в таблице. Существуют разные типы устройств с различными свойствами/столбцами. Пример:Как моделировать абстракцию в SQL?

Пользователь «mike» имеет «телевизор (размер дюйма, потребление энергии)», «холодильник (минимальная температура, высота, ширина)».

У пользователя есть список «бытовых приборов».

Я не знаю, как я мог бы моделировать это в хорошем смысле. В конце концов, я просто хочу запросить db: какие устройства (и их свойства) есть у пользователя?

ответ

1

Вы могли бы создать модель, как:

user (id, name) 
    1, bob 
    2, mark 
    ... 
device (id, name) 
    1, TV 
    2, Fridge 
    ... 
attributes (id, name) 
    1, size inch 
    2, energy consumption 
    3, min temperature 
    4, height 
    ... 
device_has_attribute (id_device, id_attribute, value) 
    1, 1, 2.7inches (you decide the unit or it could be another table) 
    1, 2, 220v 
    2, 1, 6.7ft 
    2, 3, 30F 
    ... 
home_appliance (id, name) 
    1, Kitchen 
    2, Living room 
    ... 
home_appliance_device (id_home_appliance, id_device) 
    1, 1 
    2, 1 
    2, 2 
    ... 
user_home_appliance (id_user, id_home_appliance) 
    1, 1 
    1, 2 
    2, 2 
    ... 

Я рекомендую вам добавить модуль значения в другой таблице было бы

unit (id, name, acronym) 
device_has_attribute (id_device, id_attribute, value, id_unit) 
3

Это классическая проблема моделирования данных и проектирования баз данных , Это разные имена, чем те, которые вы использовали, «абстракция». В ER-моделировании его обычно называют «обобщением/специализацией». При моделировании объектов он обычно называется моделированием «класс/подкласс» или «наследованием».

Когда дело доходит до проектирования таблиц SQL для соответствия этим моделям, существует несколько методов, которые могут вам помочь. В ранние годы SQL не имел общих возможностей для помощи в этой ситуации, несмотря на то, что это происходит снова и снова в реальном мире. Два метода, которые приходят на ум, - это «наследование отдельных таблиц» и «наследование таблицы классов».

Наследование отдельных таблиц заполняет все данные для класса и подклассов в одну таблицу. Это хорошо для самых простых ситуаций. Для меня это выглядит немного сложнее.

Наследование таблицы классов содержит одну таблицу для данных класса и отдельную таблицу для каждого подкласса. Ответ Хорхе Кампоса выглядит так. В связи с таблицей классов существует метод, называемый «общий первичный ключ». В подклассах нет собственного поля идентификатора. Вместо этого внешний ключ, который ссылается на таблицу классов, используется в качестве первичного ключа таблицы подкласса. Это делает соединение простым, легким и быстрым. Он также обеспечивает единообразный характер отношения подкласса.

Быстрый поиск по этим ключевым словам должен дать вам множество описательных примеров. Мне особенно нравится, как Фаулер представляет эти концепции. Или вы могли бы начать с вкладкой информации об этих трех тегах:

+0

А когда вы идете из таблицы суперкласса к подклассу? Для произвольного количества подклассов, не хотите ли вы, чтобы поле «type» в суперклассе указывало на таблицу подкласса, чтобы избежать запроса каждой таблицы отдельно для информации подкласса? – markw

+0

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

+0

Отличный ответ. :) +1 –

Смежные вопросы