当前位置: 首页 > 面试题库 >

我应该在Django中避免多表(具体的)继承吗?

皇甫通
2023-03-14
问题内容

许多经验丰富的开发人员建议不要使用Django多表继承,因为它的性能很差:

  1. Django的疑难杂症:混凝土继承由雅各布·卡普兰,莫斯,Django的一个核心因素。

从长远来看,在几乎每种情况下,抽象继承都是一种更好的方法。我已经看到了不止几个站点在具体继承所带来的负担下被压垮,因此我强烈建议Django用户对具体继承的任何使用都带有大量怀疑态度。

  1. Django的两个独家新闻,作者Daniel Greenfield(@pydanny)

作者和许多其他开发人员认为多表继承(有时也称为“具体继承”)是一件坏事。强烈建议你不要使用它。

不惜一切代价,每个人都应避免多表继承,因为它会增加混乱和大量开销。在模型之间使用显式的OneToOneFields和ForeignKeys代替多表继承,这样你就可以控制遍历联接的时间。

但是如果没有多表继承,我将很难

  1. 另一个模型中的参考基础模型(必须使用GenericForeignKey或反向依赖);

  2. 获取基本模型的所有实例。

(随时添加更多)

那么Django中的这种继承有什么问题呢?为什么显式的OneToOneFields更好?

JOIN对性能有多大影响?是否有任何基准可以表明性能差异?


问题答案:

先,继承不是对关系数据库体系结构的自然转换(好吧,我知道,Oracle类型对象和其他一些RDBMS支持继承,但是django不利用此功能)

此时,注意django会为子类生成新表,并编写许多left joins表来从此“子表”中检索数据。和左连接是不是你的朋友。在高性能场景中,例如游戏后端或其他东西,你应该避免使用它,并使用一些技巧(如null,OneToOne或外键)“手动”解决继承问题。在这种OneToOne情况下,你可以直接或仅在需要时调用相关表。

…但是…

“我认为(TGW)” 应该在你的企业项目中包含模型继承时,将其纳入你的讨论范围。我这样做了,由于此功能,我为客户节省了很多开发时间。另外的代码变得干净而优雅,这意味着维护方便(比通知此类项目不具有数百或请求由第二)

逐题提问

问:Django中的这种继承有什么问题?
答:很多桌子,很多左联接。

问:为什么显式的OneToOneFields更好?
答:你可以直接访问相关模型,而无需左联接。

问:是否有说明性示例(基准)?
答:没有可比性。

问:select_related()不允许我们控制何时调用JOIN吗?
答:django连接所需的表。

问:当我需要在另一个模型中引用基类时,多表继承的替代方法是什么?
答:废话。OneToOne关系和许多代码行。这取决于应用程序的需求。

问:在这种情况下,GenericForeignKeys是否更好?
答:不适合我。

问:如果我需要OneToOneField作为基础模型怎么办?答:写出来。这没有问题。例如,你可以扩展用户模型,也可以为某些用户使用从一对一到用户的基本模型。

结论

你应该知道没有模型继承的编写和维护代码的成本,以及支持模型继承应用程序并采取相应措施的硬件成本。



 类似资料:
  • 问题内容: 有时是有用的,例如,如果我为网站上的所有链接(例如选择器)定义了通用样式,但是当我要覆盖某些规则时,可以有以下选择: 使用更具体(更长)的选择器 采用 哪种方法更好,可能有一些指导原则? 问题答案: 使用非常,非常谨慎- 它会覆盖刚才的一切,甚至是内联样式和混乱在低于显而易见的方式与样式规则“梯级”,让CSS的名字。它很容易使用不当,而且容易成倍增加,尤其是在滥用时。您可以轻松地得出一

  • 问题内容: Django中对单表继承有显式支持吗?最后我听说,该功能仍在开发和辩论中。 在此期间是否可以使用库/黑客来捕获基本行为?我有一个混合了不同对象的层次结构。具有Employee类,雇员类型的子类和manager_id(parent_id)的公司结构的规范示例将很好地逼近我正在解决的问题。 就我而言,我想代表一个想法,即一个员工可以在由另一个员工管理的同时管理其他员工。没有用于Manage

  • 我有一个用Grails 2.3.8编写的大项目。有时,当我使用我的CI部署它时,我收到以下消息: 由于StackOverflow Error,无法完成Web应用程序[/ProjectName##1152]的注释扫描。 可能的根本原因包括 -Xss 设置过低和非法的循环继承依赖关系。正在处理的类层次结构是 [org.bouncycastle.asn1.ASN1EncodableVector- 我已经

  • 问题内容: 首先,提供一些指向我参考的页面的链接:一个SO问题,以及有关通用关系和多表继承的Django文档。 到目前为止,我已经建立了一个多表继承设计。对象(例如:汽车,狗,计算机)可以继承Item类。我需要能够从数据库中检索项目,获取子类并对其进行处理。我的设计不允许一一检索不同类型的对象,因此我需要使用Item容器将它们全部包装为一个。有了Item后,Django文档说我可以通过使用模型名称

  • 问题内容: 我在JUnit中有许多测试用例。它们都需要相同的代码才能在其静态方法中执行。这是代码重复,我正在努力摆脱它。这样做是一种肮脏的方式。JUnit中是否还有其他机制可能会有所帮助? PS。我写了关于这个主题的博客文章:http : //www.yegor256.com/2015/05/25/unit-test- scaffolding.html 问题答案: 规则是构成可重用代码(而不是从其

  • 问题内容: 建议在HTML页面中使用表格(现在已经有了CSS)? 表格有什么用途?表具有哪些CSS所没有的功能? 问题答案: 一点都不。但是将表格用于表格数据。只是不要将它们用于一般布局。 但是,如果您显示表格数据(例如结果或什至是表格),请继续使用表格!