0

我很难决定多表继承还是抽象基础模型。假设我有一个带有大量模型的 Django 项目,比如说......

视频、文档、图片和更多内容。

他们将共享一些共同的领域和功能。例如,我可能想要显示一个包含所有类型的最新 20 个项目的列表,并且用户可以对这些内容类型中的任何一个进行评分或标记,或者用户可以拥有自己的列表,其中将包含多种内容类型。

像这样的东西:

BaseItem
    - added
    - updated
    - tags
    - ratings

Video(BaseItem)

Document(BaseItem)

Person(BaseItem)

我想知道这是否是使用多表继承的好案例,或者我是否应该简单地使用抽象基类。

1 - 使用多表继承。

这意味着我可以轻松查询和显示所有类型的最新 20 项。我可以在需要时使用 django-model-utils 中的 InheritenceManager 之类的东西来获取正确的类型。毫无疑问,我需要小心使用 select_related 并在检索项目时留意我的查询计数。

2 - 使用抽象基类。

这似乎更容易确切地知道发生了什么,并且在仅查询单个内容类型时它会针对一个非常大的表保存 JOIN,但我想我无法在数据库中组合这些类型级别,因此需要在 Python 中这样做,这感觉就像是软糖。我还需要我的标记模型将 GFK 用于多种类型,而不是仅将 FK 用于 BaseItem。

从某种纯度的角度来看,多表继承感觉应该是正确的,但我看到人们建议尽可能避免它。在我的情况下,我觉得我不确定额外的 JOIN 和潜在的能力让某人通过错过 select_related 调用而在脚上开枪是值得的,而且我也觉得我不太清楚在哪里这可能会导致将来出现问题。

关于哪种方式是更好的选择以及为什么,或者我可以在任何地方找到更多关于权衡的讨论的任何想法?

谢谢!

4

1 回答 1

1

使用抽象类。Video、Document 和 Person 没有概念上的父类。这将避免为 BaseItem 创建一个新表,每次您在其中任何一个表中提取数据时都需要连接。如果您只是将方法附加到表而不是列,那么我还建议只使用 mixins。

于 2013-10-14T13:43:01.800 回答