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:从你在评论中描述的来看,继承似乎是有意义的