对不起的标题感到抱歉,但我不知道如何简短地说明这一点。问题如下:
我有一个代表群组的通用项目,我们称之为 Car 。现在这个 Car 具有一定范围内的属性,例如,对于通常的 Car ,速度在0到180之间。想象一下这里有一些范围的更多属性,例如,无论该值可能代表什么颜色,颜色都在0到255之间。
所以在我的表 GenericItems 中我有:
ID Name
1 Car
在我的属性中,我有:
ID Name Min_Value Max Value
1 Speed 0 180
2 Color 0 255
Car和Attributes之间的关系因此是1:n。
现在我开始使用我的 Car 的非常具体的实例,例如FordMustang,A FerrariF40和DodgeViper。 这些是特定的实例,现在我想为它们的属性赋予它们特定的值。
所以在我的表 SpecificItem 中我有:
ID Name GenericItem_ID
1 FordMustang 1
2 DodgeViper 1
3 FerrariF40 1
现在我需要第三个表 SpecificAttributes2SpecificItems ,以将属性与 SpecificItems 匹配:
ID SpecificItem_ID Attribute_ID Value
1 1 1 120 ;Ford Mustang goes 120 only
2 1 2 123 ;Ford Mustang is red
3 2 1 150 ;Dodge Viper goes 150
4 2 2 255 ;Dodge Viper is white
5 3 1 180 ;FerrariF40 goes 180
6 3 2 0 ;FerrariF40 is black
正如您所看到的,这个设计的问题是,我基本上总是复制所有属性行,我觉得这是糟糕的设计,不一致等。我怎样才能在正确的,规范化的情况下实现这个逻辑方式是什么?
我希望能够拥有多个通用项,其中多个属性的最小/最大值为间隔,可以使用特定值“实例化”
答案 0 :(得分:1)
在数据库模型中使用继承的最简单方法是使用ORM工具。对于Python,有SQLAlchemy,Django等。
现在你应该想知道是否福特野马是一种汽车,或汽车的一个实例。在前一种情况下,您应该创建一个定义ford_mustang属性的ford_mustang表。然后,ford_mustang表还应具有car表的外键,其中指定了每个FordMustang的通用属性。在后一种情况下,每种汽车只是Car表中的一排。无论哪种方式,每个属性都应该在一个列中表示。
属性的验证通常在应用程序的业务逻辑中完成。
答案 1 :(得分:1)
看起来你正在尝试将实体属性值复制为一种设计,这会导致很多丑陋的表格(好吧,通常它是一个单独的表格)。
http://en.wikipedia.org/wiki/Entity-attribute-value_model http://ycmi.med.yale.edu/nadkarni/Introduction%20to%20EAV%20systems.htm
讨论EAV往往导致“宗教战争”,因为很少有好地方可以使用它(很多人说没有好地方)而且还有其他人认为,因为它非常灵活,所以应该随处可见。如果我能找到我正在寻找的参考,我会将其添加到此。
答案 2 :(得分:1)
有一种观点认为,任何在RDBMS中构建EAV模型的尝试构成“糟糕的设计”,但我们不会去那里。哎呀,看起来像其他人已经做过。
我不确定你担心什么。 SpecificAttributes2SpecificItems 是一个交集表(线索在名称中)。必然包含指向属性和 SpecificItems 的链接。怎么可能不行?
您可能需要在 SpecificAttributes2SpecificItems 上使用MinVal和MaxVal,因为某些项目的范围将比 GenericItems 允许的范围更有限。例如,每个人都知道法拉利应该只有红色。
答案 3 :(得分:1)
一些想法:
首先,您应该考虑将“genericgroups”表格设为“属性”,而不是将其悬停在其余数据之上。
其次,您可以更轻松地让每个属性表实际保存项目的属性,而不仅仅是属性的概念。如果要获得范围,请考虑枚举类型(对于项目名称)或仅考虑具有最大设置的整数(因此color_value列的值不能高于255)。这样你最终会得到更像:
Item Table
ID Name
1 FordMustang
2 DodgeViper
3 FerrariF40
ItemType Table:
ItemID Type
1 Car
2 Car
3 Car
ItemColor Table:
ItemID ColorID
1 123
2 255
3 0
MaxSpeed Table
ItemID MaxSpeedID
1 120
2 150
3 180