我很难决定多表继承与抽象基本模型。假设我有一个带有大量模型的Django项目,比如......
视频,文档,图片和更多信息。
他们将分享一些共同的领域和功能。例如,我可能想要显示所有类型混合的最新20个项目的列表,并且用户可以对这些内容类型中的任何一个进行评级或标记,或者用户可以拥有其自己的列表,其将包括多种内容类型。
这样的事情:
BaseItem
- added
- updated
- tags
- ratings
Video(BaseItem)
Document(BaseItem)
Person(BaseItem)
我想知道这是否是使用多表继承的好例子,或者我应该只使用抽象基类。
1 - 使用多表继承。
这意味着我可以轻松地查询和显示所有类型的最新20个项目。我可以使用类似django-model-utils的InheritenceManager来获取正确的类型。毫无疑问,我需要小心使用select_related并在检索项目时密切关注我的查询计数。
2 - 使用抽象基类。
这似乎更准确地知道发生了什么,并且在查询单个内容类型时它会将JOIN保存在一个非常大的表中,但我想我无法将数据库级别的类型,因此需要在Python中这样做,这感觉就像一个软糖。我还需要我的Tag模型将GFK用于多种类型而不是FK只用于BaseItem。
多表继承感觉它应该从某种纯度的角度来看是正确的,但我看到人们建议尽可能避免它。在我的情况下,我觉得好像我不确定额外的JOIN和潜在的能力让某人通过错过一个select_related调用来自己射击是值得的,我也觉得我不是很清楚在哪里这可能会在将来引起问题。
任何关于哪种方式的想法都是更好的选择以及为什么,或者我可以在任何地方找到更多关于权衡的讨论?
谢谢!
答案 0 :(得分:1)
使用抽象类。视频,文档和人物没有概念上的父类。这将避免为每次在任何一个表中提取数据时为BaseItem创建一个需要连接的新表。如果你只是将方法附加到表而不是列,那么我也建议只使用mixins。