代码之家  ›  专栏  ›  技术社区  ›  Tom

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

  •  0
  • Tom  · 技术社区  · 17 年前

    对不起,标题不好,但我不知道该怎么简写。问题如下:

    我有一个表示组的通用项,我们称之为 小型车 . 现在这个 小型车 具有一定范围内的属性,例如,通常速度在0到180之间 小型车 . 假设这里还有一些具有范围的属性,例如,颜色在0到255之间,不管这个值代表什么。

    所以在我的桌子上 通用项 我有:

    ID    Name
    
     1    Car
    

    在我的 属性 我有:

    ID   Name   Min_Value    Max Value
     1   Speed     0            180
     2   Color     0            255
    

    因此,car和属性之间的关系是1:n。

    现在我开始有非常具体的实例 小型车 例如福特野马,法拉利40和道奇毒蛇。 这些是特定的实例,现在我想为它们的属性提供特定的值。

    所以在我的桌子上 具体项目 我有:

    ID    Name           GenericItem_ID
    
     1    FordMustang         1
     2    DodgeViper          1
     3    FerrariF40          1
    

    现在我需要第三张桌子 特定属性2特定项 ,以匹配属性 具体项目 :

    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 回复  |  直到 17 年前
        1
  •  1
  •   Tangurena    17 年前

    看起来您正在尝试将实体属性值作为一种设计来复制,这会导致许多难看的表(好吧,通常情况下,它是一个用于所有内容的单一表)。

    http://en.wikipedia.org/wiki/Entity-attribute-value_model http://ycmi.med.yale.edu/nadkarni/Introduction%20to%20EAV%20systems.htm

    讨论EAV往往会导致“宗教战争”,因为很少有好的地方可以使用它(许多人说没有好的地方),还有一些人认为,因为它是如此的灵活,应该在任何地方使用。如果我能找到我要找的参考资料,我会把它加到这个上面。

        2
  •  1
  •   pvoosten    17 年前

    在数据库模型中使用继承的最简单方法是使用ORM工具。对于python,有sqlacalchemy、django等。

    现在你应该想知道,比如福特野马是一种汽车,还是汽车的一个实例。在前一种情况下,您应该创建一个定义福特野马属性的福特野马表。然后,福特野马表还应该有一个到汽车表的外键,其中指定了每个福特野马的通用属性。在后一种情况下,每种汽车只是汽车表中的一行。无论采用哪种方式,每个属性都应该表示为一列。

    属性的验证通常在应用程序的业务逻辑中完成。

        3
  •  1
  •   APC    17 年前

    有一个学派认为,任何在RDBMS中构建EAV模型的尝试都是“糟糕的设计”,但我们不会去那里。哎呀,看来已经有人做过了。

    我不知道你担心什么。 特定属性2特定项 是交叉表(线索在名称中)。它必然包含到 属性 以及 具体项目 .怎么会不呢?

    你可能需要一个minval和一个maxval 特定属性2特定项 ,因为某些项目的范围比 通用项 . 例如,每个人都知道法拉利应该只有红色的。

        4
  •  1
  •   Anthony    17 年前

    两种想法:

    首先,您应该考虑将“genericgroups”表设置为“attribute”,而不是将其悬停在其余数据之上。

    第二,让每个属性表实际保存项目的属性可能会更容易,而不仅仅是属性的概念。如果要有一个范围,可以考虑使用枚举类型(对于项名称)或简单地使用一个设置了最大值的整数(因此颜色值列的值不能超过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