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

2024-09-27 00:19:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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


我将如何对数据建模,其中:

  1. 所有的植物都是同一型号的
  2. 对不同的植物类型强制使用一组属性
    1. 在集合中的这些属性中,有些属性可以为每个工厂提供多个值,但所有属性都至少需要一个值。在
  3. 添加新植物类型时,可以创建新属性、新集合或重用旧属性

到目前为止,我只有一个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中实现这一点


Tags: 数据模型区域类型属性sqlalchemyorm代表
2条回答

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

有一种东西叫做Object-relational impedance mismatch。松散地说,这意味着如果您不在数据库模型中使用继承,您将更加高兴。在

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

Each plant type then has differing requirements for a set of attributes, some of which a plant can have multiple values (habitat, regions located, etc.). For example, trees are unlikely to have more than one type of life cycle where as flowers have differing life cycles.

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

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

在这种情况下,你已经(至少?)SQLAlchemy的三种选择:

  • Single table inheritance:在这种情况下,在DB级别,只有一个表存储基类的任何实例。对于每个实例,只有必需的字段被“使用”
  • ^{a5,每个类都有一个
  • Joined table inheritance:您有一个基类表和一些“附加”表来为不同的子类添加所需的属性

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

相关问题 更多 >

    热门问题