我有一个代表植物的模型。每种植物都有一种类型(花、树、灌木等)。每种植物类型对一组属性都有不同的要求,其中一些属性可以具有多个值(栖息地、所处区域等)。例如,树木不太可能有一种以上的生命周期,因为花朵有不同的生命周期。在
我将如何对数据建模,其中:
到目前为止,我只有一个plants表,在它自己的表中,每个属性都有多个多对多的关系,并且我将在代码中强制至少一个值。在
http://i.imgur.com/82CoW15.png
我曾考虑过对属性使用实体属性值,但这样我就不会真正受益于所使用的ORM(SQLAlchemy)。序列化LOB也是如此。在
我想我需要类表继承,但我不确定如何处理某些属性可以有序地具有多个值。在
Plant Habitat
----- |--> --> ------- --> Multiple values per plant
|
| Flower Life Cycle
|--> ------ --> ---------- --> Single Value
|
| Tree Cone Type
|--> ---- --> --------- --> Single value
|
| Shrub
|--> -----
另一种可能是在运行时为每个新属性添加属性表,但我不确定如何在SQLAlchemy或任何其他ORM中实现这一点
查看joined table inheritance的文档。将植物定为基类,而花、灌木、树木可以有自己的表。每个子工厂表都可以有任何必要的外键关系。在
有一种东西叫做Object-relational impedance mismatch。松散地说,这意味着如果您不在数据库模型中使用继承,您将更加高兴。在
我不确定这是否可行/可取,但:
如果您主要关心的是多重性(或者说DBA语言的cardinality),则不需要继承。你只需要一个“one-to-many”关系。例如,每个
plant
可以关联到“一对多”life cycle
。在如果
plant
的每一个子集为其父集添加一个或多个不同的属性,那么您将真正受益于继承。在在这种情况下,你已经(至少?)SQLAlchemy的三种选择:
选择一种解决方案还是另一种解决方案将取决于您的用例以及您(和外部应用程序)将如何查询数据库。在
相关问题 更多 >
编程相关推荐