繁体   English   中英

SQLAlchemy通过抽象使多对多复杂

[英]SQLAlchemy complex many to many with abstractions

我们在非常复杂的数据库中拥有这种模式,该模式本质上可以归结为每个边上都有元数据的有向图。 我们正在解决它,但是我敢肯定有一个“更好”的解决方案。 我将尝试通过一个例子来描述这种情况。

这个例子就是我们在一些顶级对象类型上分类缺陷的例子。 这些顶级对象类型是“水果”,“汽车”和“人”。 缺陷也是顶级对象类型,但是有两种形式:审美缺陷和结构缺陷。

因此,例如,汽车可能同时具有美学缺陷和结构缺陷。 重要的是,可以将相同的Structuredefect分配给Car和Fruit。

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

方括号表示表格的主键

实体类型 ->(无orm对象)

  • [entity_type_id]-smallint
  • entity_type-字符串

实体 -> entity_type_map

  • [entity_id]-bigint
  • entity_type_id-smallint

对象表示为:

水果 -> FruitsModel

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

汽车 -> 汽车模型

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

->人模型

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

缺陷的表示方式类似:

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

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

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

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

缺陷按以下方式映射到实体:

缺陷实体图 -> 缺陷实体图

  • [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 ??

为了得到我目前拥有的水果缺陷列表。 对每种缺陷类型执行查询,然后在python中串联两个列表。

建立关系的正确方法是什么,这些关系将使我所有的缺陷成为其基类(BaseDefectModel)或包含混合类型的列表(AesDefectModel和StructDefectModel)? 如果没有关系,是否可以通过一个查询来完成?

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

答案原来是使用多态继承,我刚才才明白。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM