我有一个“家用电器”列表,我想建模数据库以将它们保存在表格中。有不同的设备类型具有不同的属性/列。 示例:
用户“mike”有一个“电视(尺寸英寸,能耗)”,“冰箱(最小温度,高度,宽度)”。
用户有一个“家用电器”列表。
我不知道如何以一种很好的方式对此进行建模。最后,我只想查询db:用户具有哪些设备(及其属性)?
答案 0 :(得分:3)
这是数据建模和数据库设计中的经典问题。它的名称与您使用的名称不同,"抽象"。在ER建模中,它往往被称为"泛化/专业化"。在对象建模中,它往往被称为" class / subclass"建模,或"继承"。
在设计SQL表以匹配这些模型时,有几种技术可以帮助您。在早期,SQL没有一般设施来帮助解决这种情况,尽管它在现实世界中一次又一次地发生。我想到的两种技术是单表继承"和"类表继承"。
单表继承将类和子类的所有数据填充到一个表中。它对最简单的情况有好处。对我来说,你的案子看起来有点复杂。
类表继承为类数据提供了一个表,为每个子类提供了一个单独的表。 Jorge Campos的答案看起来像这样。与类表相关,有一种称为"共享主键"的技术。子类表没有自己的id字段。相反,引用类表的外键用作子类表的主键。这使得连接简单,容易且快速。它还强制实现子类关系的一对一性质。
快速搜索这些流行语应该会为您提供大量的描述性示例。我特别喜欢福勒提出这些概念的方式。或者你可以从这三个标签的信息标签开始:
single-table-inheritance class-table-inheritance shared-primary-key
答案 1 :(得分: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)