我有一个代表植物的模型。每株植物都有一种(花,树,灌木等)。然后,每种植物类型对一组属性具有不同的要求,其中一些属性可以具有多个值(栖息地,所在的区域等)。例如,树木不太可能有一种以上的生命周期,因为花朵的生命周期不同。
我如何在以下位置建模我的数据:
到目前为止,我有一个工厂表,与自己的表中的每个属性有多个多对多关系,我会在代码中强制执行至少一个值。
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中完成该属性
答案 0 :(得分:0)
查看joined table inheritance的文档。植物将是一个基类,花,灌木,树可以有自己的表。每个子工厂表都可以具有任何必要的外键关系。
答案 1 :(得分:0)
有一个名为Object-relational impedance mismatch的东西。松散地说,这意味着如果你不在数据库模型中使用继承,你会更高兴。
我不确定这是否可行/可取,但是:
每种植物类型对一组具有不同的要求 属性,其中一些植物可以有多个值(栖息地, 区域等)。例如,树木不太可能有更多 生命周期不同于花朵生活不同的生命周期 周期。
如果您主要关心的是多样性(或cardinality说DBA语言;),则不需要继承。您只需要一个“one-to-many”关系。例如,每个plant
都可以与“一对多”life cycle
相关联。
如果plant
的每个子集为其父集添加一个或多个不同属性无意义,您将真正享受继承的好处。
在这种情况下,您在SQLAlchemy中有(至少?)三个选项:
一个解决方案或另一个解决方案的选择将以您的用例为指导 - 以及您(以及外部应用程序)将如何查询数据库。