【问题标题】:Django Multi-Table-Inheritance and Left Outer JoinsDjango 多表继承和左外连接
【发布时间】:2013-11-30 02:48:54
【问题描述】:

最近我有一个关于模型继承的 Django 常见问题。我有一堆不同的模型,我想单独或作为一个组展示。读作:查询数据库中的所有内容,或者只是某个类别(模型)的项目。

最终,我选择了多表继承。我的模型看起来像:

class Unit(models.Model):
    etc, etc...

class Child1(Unit):
    etc, etc...

class Child2(Unit):
    etc, etc...

所以现在我可以查询单位以获取所有内容,并查询单个子项以获取更具体的信息。它工作正常,但我只是查看了为所有单元列表生成的 SQL……它变得非常丑陋!

SELECT "all the fields from all the tables (Unit and Children)" 
FROM "Unit" 
LEFT OUTER JOIN "Child1" ON ("whatever") 
    LEFT OUTER JOIN "Child2" ON ("whatever") 
        LEFT OUTER JOIN "Child3" ON ("whatever") 
            LEFT OUTER JOIN "Child4" ON ("whatever") 
                LEFT OUTER JOIN "Child5" ON ("whatever")

基本上,当我获得所有项目的索引视图时,Unit 的每个子项都需要另一个左外连接。

假设我最多有 5 个 Unit 的孩子,并且数据库中最多有 200 个项目,这会破坏交易吗?我总是可以缓存索引视图,是吗?还是我错过了 MTI 的另一个问题? “2 Scoops of Django”一书绝对反对使用多表继承……甚至说“永远不要这样做”。但我觉得它解决了我的问题,很容易理解,考虑到 Django 处理关系的方式,它几乎是一个必要的邪恶。

保留我所拥有的还是回到绘图板上?

【问题讨论】:

  • 你能扩展你的问题吗?我知道您有问题,但我无法建议其他解决方案,因为我没有看到问题,只有您的解决方案。

标签: django join


【解决方案1】:

如果您的问题是加载不需要的数据,您可以使用only method 从数据库中仅检索您需要的数据。

如果问题有点像这种情况:

您有一个模型总是有值,但它可以有几个不同的“配置文件”,可能会或可能不会被填写。

我认为你的状态很好,我的意思是,另一种选择是将所有内容都设置为 nullable,这不太好,或者使用 ForeignKeys,这将导致相同类型的查询。我唯一要注意的是,只有在模型继承对您正在使用的实体有意义时才应该使用模型继承,否则您可以使用OneToOne field(这只是在概念上,因为继承在后台使用 OneToOne 字段)

【讨论】:

  • 困扰我的不是 SQL 中包含的字段数量,而是 5 个连接!我只是想知道从性能的角度来看这到底有多糟糕。如果重新考虑我的模型的结构是否值得。我听过很多“拒绝多表继承”的说法(我怀疑这种加入恶作剧是关键原因之一),但我想知道它有多大意义真的是......其中有多少只是“最佳实践势利”:)
  • 我想说的是:如果您只拆分模型是因为您只想加载部分数据,那么您可以只拥有一个包含所有数据的模型并有选择地加载您想要的only,这样就没有一个join了。
猜你喜欢
  • 1970-01-01
  • 2016-10-29
  • 2012-06-07
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2016-01-01
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多