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

Posted

技术标签:

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

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


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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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

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

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

Single table inheritance:在这种情况下,在数据库级别,只有一个表存储基类的任何实例。对于每个实例,只有必填字段被“使用” Concrete table inheritance:在这种情况下,每个具体类都有一个表 Joined table inheritance:你有一个基类表和一些“附加”表来为各种子类添加所需的属性

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

【讨论】:

以上是关于植物表,植物种类很多,每个植物有很多属性,有些属性有多个值的主要内容,如果未能解决你的问题,请参考以下文章

python面向对象实战练习植物大战僵尸

被子植物花器官发育的分子机制

基于深度学习的植物表型图像识别技术综述

Python植物大战僵尸

pvz2网络延迟补偿

植物大战僵尸mixed怎么下载?