Sqlalchemy 将一个模型与单个关系中的多个其他模型关联

Sqlalchemy 将一个模型与单个关系中的多个其他模型关联,sqlalchemy,flask,flask-sqlalchemy,Sqlalchemy,Flask,Flask Sqlalchemy,我有一个模型Thing,它可以被几种类型的Thing子类化,比如PointyThing和TastyThing。我有第二个模型,实例,它与事物一对多相关(一个实例可能是单个事物的类型,但给定事物将有许多实例)实例s然后与播放器(每个实例都有一个播放器,但是播放器有许多实例和backref关联,这样播放器就可以调用它的.inventory属性来查看它拥有什么 一切都很好,但我还有一个模型Place。我想让Places拥有实例s,就像玩家拥有实例一样 最好创建一个与实例模型链接的所有者模型,然后子类化

我有一个模型
Thing
,它可以被几种类型的
Thing
子类化,比如
PointyThing
TastyThing
。我有第二个模型,
实例
,它与
事物
一对多相关(一个
实例
可能是单个
事物
的类型,但给定
事物
将有许多
实例
)<代码>实例s然后与
播放器
(每个
实例
都有一个
播放器
,但是
播放器
有许多
实例
和backref关联,这样
播放器
就可以调用它的
.inventory
属性来查看它拥有什么

一切都很好,但我还有一个模型
Place
。我想让
Place
s拥有
实例
s,就像
玩家拥有
实例一样


最好创建一个与
实例
模型链接的
所有者
模型,然后子类化以获得
播放器
s和
放置
s,或者在SQLAlchemy中创建一些我还不知道的未知方法吗?

我认为您所要求的
最佳
解决方案取决于许多因素因素

从技术上讲,如果我孤立地看一下您的示例,这个解决方案看起来像是一个相当不错的下降
,它避免了创建另一个
关系
表。如果您永远不会使用多态性支持进行查询,那么这可能会很好。然而,这仍然是一个黑客。想象一下,稍后您将
播放器
模型扩展为几个子类,您可能会开始使用多态查询,并且您将始终必须问自己
“它将如何影响我的黑客”
。即使所有的事情都能很好地工作(现在我不能给出打破你逻辑的例子),你仍然需要小心。
但是让我们看看这个黑客的好处是什么?我们保存了一个
关系
表,但实际上您为您的
所有者
模型引入了另一个表(我假设),那么真正的收益是什么

另一方面,我想知道您的
实例
表是否实际上不应该是一个
三元
关系?我假设
事物的每个实例都存储在某个
位置
,可能属于一个
播放器
,因此它可能只是一个如下所示的表:

Instance[
    ID primary_key, 
    Thing_ID (FK) NOT NULL, 
    Place_ID (FK) NOT NULL, 
    Person_ID (FK) NULL
]
请注意,
Person\u ID
是可以为空的,因为我假设该对象的实例在分配之前可能不属于任何人。但在您的情况下,它可能总是
不为NULL


希望这有帮助。最好能知道你决定走哪条路以及为什么。

我不能走三元关系的原因是,一件东西可以属于一个地方,也可以属于一个人(比如它可以在地板上,也可以在某人的口袋里)。由于每个
对象每次只属于一个
所有者
对象,因此我想我选择继承。虽然我和这个项目的其他开发人员讨论过包含容器(所以突然间
Thing
也会是
Owner
的一个子类),但我认为我们需要坐下来再次找出完整的对象层次结构。谢谢你的意见,它确实帮助我走上了正确的道路。@Drakekin:从你在评论中描述的来看,继承似乎是有意义的