植物表,植物种类很多,每种植物都有很多属性,有些属性有多个值

时间:2013-06-21 06:02:34

标签: python database database-design orm

我有一个代表植物的模型。每株植物都有一种(花,树,灌木等)。然后,每种植物类型对一组属性具有不同的要求,其中一些属性可以具有多个值(栖息地,所在的区域等)。例如,树木不太可能有一种以上的生命周期,因为花朵的生命周期不同。


我如何在以下位置建模我的数据:

  1. 所有植物都属于同一型号
  2. 在不同的工厂类型上实施一组属性
    1. 在集合中的那些属性中,其中一些属性可以为每个工厂设置多个值,但都需要至少一个。
  3. 添加新工厂类型时,可以创建新属性,新集或重用旧属性

  4. 到目前为止,我有一个工厂表,与自己的表中的每个属性有多个多对多关系,我会在代码中强制执行至少一个值。

    http://i.imgur.com/82CoW15.png


    我已经考虑过对属性使用Entity-Attribute-Value,但是我不会真正拥有我正在使用的ORM(SQLAlchemy)的好处。与序列化LOB相同。

    我认为我需要类表继承,但我不知道如何处理某些属性可以有序地拥有多个值。

    Plant                          Habitat
    -----    |-->           -->    -------  --> Multiple values per plant
             |
             |      Flower         Life Cycle
             |-->   ------  -->    ---------- --> Single Value
             |
             |      Tree           Cone Type
             |-->   ----    -->    --------- --> Single value
             |
             |      Shrub
             |-->   -----
    

    另一种可能性是在运行时为每个新属性添加属性表,但我不确定如何在SQLAlchemy或任何其他ORM中完成该属性

2 个答案:

答案 0 :(得分:0)

查看joined table inheritance的文档。植物将是一个基类,花,灌木,树可以有自己的表。每个子工厂表都可以具有任何必要的外键关系。

答案 1 :(得分:0)

有一个名为Object-relational impedance mismatch的东西。松散地说,这意味着如果你不在数据库模型中使用继承,你会更高兴。

我不确定这是否可行/可取,但是:

  

每种植物类型对一组具有不同的要求   属性,其中一些植物可以有多个值(栖息地,   区域等)。例如,树木不太可能有更多   生命周期不同于花朵生活不同的生命周期   周期。

如果您主要关心的是多样性(或cardinality说DBA语言;),则不需要继承。您只需要一个“one-to-many”关系。例如,每个plant都可以与“一对多”life cycle相关联。

如果plant的每个子集为其集添加一个或多个不同属性无意义,您将真正享受继承的好处。

在这种情况下,您在SQLAlchemy中有(至少?)三个选项:

一个解决方案或另一个解决方案的选择将以您的用例为指导 - 以及您(以及外部应用程序)将如何查询数据库。