植物表,植物种类很多,每个植物有很多属性,有些属性有多个值
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:你有一个基类表和一些“附加”表来为各种子类添加所需的属性一种或另一种解决方案的选择将取决于您的用例——以及您(和外部应用程序)将如何查询数据库。
【讨论】:
以上是关于植物表,植物种类很多,每个植物有很多属性,有些属性有多个值的主要内容,如果未能解决你的问题,请参考以下文章