我们在非常复杂的数据库中有这种模式,它基本上归结为每个边缘都有元数据的有向图。我们正在解决它,但我确信有一个“更好”的解决方案。我将尝试用一个例子来描述这种情况。
该示例是我们在一些顶级对象类型上编目缺陷的示例。那些顶级对象类型是水果,汽车和人。缺陷也是顶级对象类型,但有两种形式:美学缺陷和结构缺陷。
因此,例如,汽车可能同时具有AestheticDefect和StructuralDefect。重要的是,可以将相同的StructuralDefect分配给Car和Fruit。
图中的所有顶级对象都有一个全局唯一的id,它被映射到一个类型。我们将顶级表示称为“实体”。
方括号表示表格的主键
实体类型 - > (没有orm对象)
实体 - > entity_type_map
对象表示如下:
水果 - > FruitsModel
汽车 - > CarsModel
人 - > PeopleModel
缺陷的表现方式相似:
审美缺陷 - > AesDefectModel(继承自BaseDefectModel)
结构缺陷 - > StructDefectModel(继承自BaseDefectModel)
缺陷会映射到实体:
缺陷实体地图 - > DefectEntityMap
我希望能够做的是:
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比我完成的大多数机器学习更复杂。