在数据库中具有类似实例的行为

时间:2009-08-25 12:02:33

标签: python mysql database database-design

对不起的标题感到抱歉,但我不知道如何简短地说明这一点。问题如下:

我有一个代表群组的通用项目,我们称之为 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

正如您所看到的,这个设计的问题是,我基本上总是复制所有属性行,我觉得这是糟糕的设计,不一致等。我怎样才能在正确的,规范化的情况下实现这个逻辑方式是什么?

我希望能够拥有多个通用项,其中多个属性的最小/最大值为间隔,可以使用特定值“实例化”

4 个答案:

答案 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