SQLAlchemy复杂多对多抽象

2024-06-07 10:48:43 发布

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

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

在这个例子中,我们对一些顶级对象类型的缺陷进行了编目。这些顶级对象类型是水果、汽车和人。缺陷也是顶级对象类型,但有两种类型:审美缺陷和结构缺陷。你知道吗

例如,一辆汽车可能既有美观缺陷,也有结构缺陷。重要的是,同样的结构缺陷可能同时存在于汽车和水果上。你知道吗

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

方括号表示表的主键

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

  • [实体类型id]-smallint
  • 实体类型-字符串

实体->;实体类型映射

  • [实体id]-bigint
  • 实体类型id-smallint

对象表示为:

水果->;水果模型

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

汽车->;汽车模型

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

人物->;人物模型

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

缺陷以类似方式表示:

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

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

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

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

缺陷映射到实体,例如:

缺陷实体映射->;缺陷实体映射

  • [缺陷\标识](引用实体(实体\标识))-bigint
  • [实体\标识](引用实体(实体\标识))-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比我所做的大多数机器学习都要复杂。你知道吗


Tags: 对象gt实体id类型db关系结构

热门问题