SQLAlchemy通过抽象复杂多对多

时间:2013-06-03 19:11:03

标签: python sqlalchemy flask-sqlalchemy

我们在非常复杂的数据库中有这种模式,它基本上归结为每个边缘都有元数据的有向图。我们正在解决它,但我确信有一个“更好”的解决方案。我将尝试用一个例子来描述这种情况。

该示例是我们在一些顶级对象类型上编目缺陷的示例。那些顶级对象类型是水果,汽车和人。缺陷也是顶级对象类型,但有两种形式:美学缺陷和结构缺陷。

因此,例如,汽车可能同时具有AestheticDefect和StructuralDefect。重要的是,可以将相同的StructuralDefect分配给Car和Fruit。

图中的所有顶级对象都有一个全局唯一的id,它被映射到一个类型。我们将顶级表示称为“实体”。

方括号表示表格的主键

实体类型 - > (没有orm对象)

  • [entity_type_id] - smallint
  • entity_type - string

实体 - > entity_type_map

  • [entity_id] - bigint
  • entity_type_id - smallint

对象表示如下:

水果 - > FruitsModel

  • [id](引用实体(entity_id)) - bigint
  • 其他专栏

汽车 - > CarsModel

  • [id](引用实体(entity_id)) - bigint
  • 其他专栏

- > PeopleModel

  • [id](引用实体(entity_id)) - bigint
  • 其他专栏

缺陷的表现方式相似:

审美缺陷 - > AesDefectModel(继承自BaseDefectModel)

  • [id](引用实体(entity_id)) - bigint
  • 其他专栏

结构缺陷 - > StructDefectModel(继承自BaseDefectModel)

  • [id](引用实体(entity_id)) - bigint
  • 其他专栏

缺陷会映射到实体:

缺陷实体地图 - > DefectEntityMap

  • [defect_id](引用实体(entity_id)) - bigint
  • [entity_id](引用实体(entity_id)) - bigint

我希望能够做的是:

class FruitsModel(db.Model):
    __tablename__ = "Fruits"

    id = db.Column(db.BigInteger, db.ForeignKey("Entities.entity_id"))
    # other cols, etc

    def print_defects(self):
        defects = self.defects
        for d in defects:
            print d

    defects = db.relationship # <--- What goes here ??

为了获得我目前正在使用Fruit的缺陷列表。执行每个缺陷类型的查询,然后在python中连接两个列表。

建立关系的正确方法是什么?它会将所有缺陷作为基类(BaseDefectModel)或包含混合类型的列表(AesDefectModel和StructDefectModel)?如果不是关系,我可以用一个查询来完成吗?

为了记录,SQLAlchemy比我完成的大多数机器学习更复杂。

1 个答案:

答案 0 :(得分:0)

答案结果是使用了多态继承,我现在才明白。

http://docs.sqlalchemy.org/en/rel_0_8/orm/inheritance.html