2013-10-14 97 views
0

我很难决定多表继承与抽象基本模型。比方说,我有一个Django项目模型的负载,说...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调用而在脚中自我拍摄会是值得的,而且我也觉得我并不是很清楚在哪里这可能会在未来造成问题。

任何想法将会是更好的选择,为什么或者在哪里我可以找到更多关于折衷的讨论?

谢谢!

回答

1

使用抽象类。视频,文档和人员没有概念父类。这将避免为每次在任何一个表中提取数据时需要连接的BaseItem创建一个新表。如果你只是附加方法的表而不是列,那么我也建议只使用mixins。