【问题标题】:Plant table, many types of plant, each plant has many attributes, some attributes have multiple values植物表,植物种类很多,每个植物有很多属性,有些属性有多个值
【发布时间】:2013-06-21 06:02:34
【问题描述】:

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


我将如何对我的数据进行建模:

  1. 所有植物都在同一个模型中
  2. 对不同的植物类型实施一组属性
    1. 在集合中的这些属性中,其中一些可以为每个植物具有多个值,但都需要至少一个。
  3. 随着新植物类型的添加,创建新属性、新集合或重复使用旧属性的能力

到目前为止,我有一个植物表,在它自己的表中与每个属性有多个多对多关系,我将在代码中强制执行至少一个值。

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 中完成此操作

【问题讨论】:

    标签: python database database-design orm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      有一个东西叫Object-relational impedance mismatch。松散地说,这意味着如果您不在数据库模型中使用继承,您会更开心。

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

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

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

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

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

      一种或另一种解决方案的选择将取决于您的用例——以及您(和外部应用程序)将如何查询数据库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 2010-10-17
        相关资源
        最近更新 更多