3

我有一个模型Thing,它可以由几种类型的ThinglikePointyThingTastyThing. 我有第二个模型,Instance它与 s 一对多相关Thing(一个Instance可能是 single 的类型,但给定的 sThing会有很多)。然后 s 与带有 backref 的 a (每个都有一个但 a有很多s)相关联,以便 a可以调用它的属性来查看它拥有什么。InstanceThingInstancePlayerinstancePlayerplayerInstancePlayer.inventory

一切都很好,但我也有一个模型Place。我希望Places 也拥有Instances ,就像 aPlayer拥有 an一样instance

最好创建一个Owner与模型链接的Instance模型,然后将其子类化以获取Players 和Places 或我还不知道的 SQLAlchemy 中的一些迄今为止未知的方法?

4

1 回答 1

2

我认为best您要求的解决方案取决于许多因素。

从技术上讲,如果我孤立地看你的例子,这个解决方案看起来像一个很好的下降hack,它避免了创建另一个relationship表。而且,如果您永远不会使用多态支持进行查询,那么这可能会很好。然而,它仍然是一个黑客。想象一下,稍后你Player用更多的子类扩展你的模型,你可能会开始使用多态查询,你总是要问自己"how will it impact my hack"?。即使一切仍然可以正常工作(现在我无法提出会破坏您的逻辑的示例),您仍然需要小心。
但是让我们看看这个黑客有什么好处?我们保存在一个relationship表上,但实际上您为Owner模型引入了另一个表(我假设具体表继承),那么真正的收获是什么?

另一方面,我想知道您的Instance表是否实际上不应该是ternary关系?我假设 的每个实例Thing都存储在 some 中Place并且可能属于 a Player,所以它可能只是一个看起来像这样的表:

Instance[
    ID primary_key, 
    Thing_ID (FK) NOT NULL, 
    Place_ID (FK) NOT NULL, 
    Person_ID (FK) NULL
]

请注意,这Person_ID是可以为空的,因为我假设 Thing 的实例在分配之前可能不属于任何人。但它可能总是NOT NULL在你的情况下。

希望这可以帮助。了解你决定走哪条路以及为什么走会很好。

于 2012-05-03T11:44:30.637 回答