我们在非常复杂的数据库中有这种模式,它本质上归结为一个有向图,每条边都有元数据。我们正在解决它,但我确信有一个“更好”的解决方案。我将尝试用一个例子来描述这种情况。
该示例是我们对一些顶级对象类型的缺陷进行分类的示例。这些顶级对象类型是水果、汽车和人。缺陷也是顶级对象类型,但有两种形式:审美缺陷和结构缺陷。
因此,例如,汽车可能同时具有 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 比我做过的大多数机器学习都复杂。