0

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

该示例是我们对一些顶级对象类型的缺陷进行分类的示例。这些顶级对象类型是水果、汽车和人。缺陷也是顶级对象类型,但有两种形式:审美缺陷和结构缺陷。

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

图中的所有顶级对象都有一个全局唯一的 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
  • 其他栏目

缺陷的表示方式类似:

Aesthetic Defect -> 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 比我做过的大多数机器学习都复杂。

4

1 回答 1

0

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

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

于 2013-06-04T05:57:23.517 回答