【问题标题】:Relating a model to multiple other models in a single relationship将一个模型与单个关系中的多个其他模型相关联
【发布时间】:2012-05-02 01:34:53
【问题描述】:

我有一个模型Thing,它可以被几种类型的Thing 子类化,例如PointyThing 和TastyThing。我有第二个模型Instance,它与Things 一对多相关(一个Instance 可能是单个Thing 的类型,但给定的Instances 会有很多Thing)。然后Instances 与带有后向引用的Player 相关联(每个instance 有一个Player,但player 有许多Instances),因此Player 可以将其称为.inventory 属性看看它拥有什么。

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

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

【问题讨论】:

    标签: sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

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

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

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

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

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

    希望这会有所帮助。最好了解您决定走哪条路以及为什么走。

    【讨论】:

    • 我不能采用三元关系的原因是因为一个东西可以属于一个地方或一个人(因为它可以在地板上或在某人的口袋里)。由于每个Thing 一次只属于一个Owner 对象,所以我想我将使用继承。尽管我和该项目的其他开发人员就包含容器进行了讨论(所以突然间Thing 也将成为Owner 的子类),但我认为我们需要坐下来再次找出完整的对象层次结构。感谢您的意见,这无疑帮助我走上了正确的道路。
    • @Drakekin:根据您在 cmets 中的描述,看起来继承实际上是有意义的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多