1

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


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

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

4

2 回答 2

0

Look at the docs for joined table inheritance. The plant will a base class, and the flower, shrub, tree can have their own tables. each of the sub-plant tables can have whatever foreign key relationships are necessary.

于 2013-06-21T06:15:04.247 回答
0

有一种叫做对象关系阻抗失配的东西。松散地说,这意味着如果您不在数据库模型中使用继承,您会更开心。

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

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

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

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

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

  • 单表继承:在这种情况下,在数据库级别,只有一个表存储基类的任何实例。对于每个实例,仅“使用”必填字段
  • 具体表继承:在这种情况下,每个具体类都有一个表
  • 连接表继承:您有一张用于基类的表和一些“附加”表,用于为各种子类添加所需的属性

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

于 2013-06-21T06:33:56.963 回答