我应该通过任何方式避免 Django 中的多表(具体)继承吗?

2023-11-23

许多经验丰富的开发人员建议不要使用Django多表继承由于其性能不佳:

  1. Django 陷阱:具体继承 by 雅各布·卡普兰-莫斯,Django 的核心贡献者。

    几乎在所有情况下,抽象继承都是更好的方法 长期来看。我见过不少网站在负载下崩溃了 通过具体继承引入,所以我强烈建议 Django 用户对具体继承的任何使用都有很大的了解。 怀疑的剂量。

  2. 两勺姜戈 by 丹尼尔·格林菲尔德 (@pydanny)

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

    不惜一切代价,每个人都应该避免多表继承 因为它增加了混乱和大量的开销。 使用显式 OneToOneFields 代替多表继承 模型之间的外键,以便您可以控制何时进行连接 穿过。

但如果没有多表继承,我就不能轻易

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

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

    (欢迎补充)

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

JOIN 对性能造成多大影响?是否有任何基准可以显示性能差异?

Does not select_related() allow us to control when JOINs are invoked?


我已将具体示例移至单独的问题因为这个变得太宽泛,并添加了一系列使用多表继承的原因。


首先,继承并不能自然地转化为关系数据库架构(好吧,我知道,Oracle 类型对象和其他一些 RDBMS 支持继承,但 django 不利用此功能)

此时,请注意django生成新表到子类并写入lots of left joins从中检索数据‘子表’. And 左连接不是你的朋友。在高性能场景中,例如游戏后端或其他场景,您应该避免它并使用一些工件(例如空值、OneToOne 或外键)“手动”解决继承问题。在OneToOne场景中,您可以直接调用相关表,也可以仅在需要时调用。

... 但 ...

“我认为(TGW)” 当模型继承出现在您的企业项目中时,您应该将其包含在内论域。我这样做了,并且由于此功能,我为客户节省了大量的开发时间。还,代码变得干净优雅这意味着易于维护(请注意,此类项目每秒不会有数百个或请求)

逐个问题

问:Django中这种继承有什么问题吗?
答:很多表,很多左连接。

问:为什么显式 OneToOneFields 更好?
A:您可以直接访问相关模型,无需左连接。

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

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

问:当我需要引用另一个模型中的基类时,多表继承的替代方法是什么?
答:无效化。一对一关系和大量代码行。这取决于应用需求。

问:在这种情况下 GenericForeignKey 更好吗?
答:不适合我。

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

结论

您应该了解在没有模型继承的情况下编写和维护代码的成本,以及支持模型继承应用程序并采取相应行动的硬件成本。

开个玩笑:你可以把它写在汇编代码上,它会运行得更快。

Quoting 特雷·亨纳:

您的时间通常比 CPU 的时间贵得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该通过任何方式避免 Django 中的多表(具体)继承吗? 的相关文章

随机推荐

  • 从 asp.net web api post 操作重定向

    我对 ASP NET 4 0 Web API 非常陌生 我们可以在 POST 操作结束时重定向到另一个 URL 吗 例如 Response Redirect url 实际上我从 MVC 应用程序上传文件 比如说www abcmvc com
  • 在 Windows 网络中启动远程进程

    我有几台从机和一台主机 它们一起运行分布式应用程序 每台从属机器上的进程都必须具有 GUI 和网络访问权限 我认为这将被称为交互式进程 为了便于使用 如果主机可以启动 停止这些从机上的进程 那就太好了 我的第一个想法是使用 WMI 和 Wi
  • Jenkins 和 Git - 如何获取提交者的名字?

    我正在尝试将更多 GIT 提交信息放入 HipChat 房间 我看到有很多 GIT 变量可以在 jenkins 中使用 我正在执行作业的执行外壳步骤 这些工作 echo GIT BRANCH echo GIT URL echo GIT CO
  • 获取接收者的意图过滤器

    我正在尝试获取处理的接收者列表android intent action BOOT COMPLETED用于其他应用程序 我只能通过以下方式获取具有该操作的应用程序 final PackageManager pm getPackageMana
  • 从 strtok() 获取零长度字符串

    我有一个 CSV 文件 其中包含以下数据 value name test etc 我试图通过使用来分割strtok string 但是 该文件可以包含零长度数据 如下所示 value test etc which strtok 跳过 有什么
  • 如何在reactjs中的map函数内部进行映射

    我有我的表格视图 而且我有正在完善显示的 posfields 使用映射函数 但我的问题是 当我尝试在 posfields 映射函数内映射 td 时 它会抛出错误 headers of undefined this POSFields map
  • 如何在ssl中激活mq

    我正在尝试通过 jms activemq 发送消息 但我希望它采用 ssl 协议 目前它实际上可以在 tcp 中运行 我使用 jndi 带有一个虚拟主题和 2 个队列 有人可以帮助我吗 我尝试了这个 但我卡住了 服务器无法启动 http a
  • safari/chrome onsubmit="location.reload(true)" 不起作用

    我网站上的表单在 Safari Chrome 中无法正常运行 当用户提交表单时 它会打开一个新选项卡 但我希望重新加载原始页面 带有表单的页面 它适用于 IE Opera 和 Firefox 代码
  • 如何刷新 UITableViewController 或 NSFetchedResultsController?

    我的 UITableViewController 或 NSFetchedResultsController 有一点问题 我不确定问题出在哪里 但我猜是 UITableViewController 正如我所说 我使用 NSFetchedRes
  • 从内存中打开?

    我正在寻找一种直接从内存加载生成的目标代码的方法 我知道 如果我将其写入文件 我可以调用 dlopen 来动态加载其符号并链接它们 然而 考虑到它从内存中开始 写入磁盘 然后由 dlopen 重新加载到内存中 这似乎有点迂回 我想知道是否有
  • Android Studio - 无法应用插件 [id 'com.android.application']

    我正在开发一个应用程序 在我的应用程序中 代码中没有错误 但是当我尝试运行我的项目时 它给出了以下错误 错误 1 1 评估项目 app 时出现问题 无法应用插件 id com android application 无法创建 AppPlug
  • 将 REINSTALLMODE 传递到 MSI 文件

    我正在使用 VisualStudio2005 和 vdproj 创建一个简单的 MSI 文件 当我启动它时 我需要传入 REINSTALLMODE 属性 我知道这可以通过命令行完成 如下所示 msiexec exe i foo msi RE
  • 使用 data.table 加速 rollapply

    我是 data tables 的新手 所以如果这是一个非常基本的问题 我深表歉意 我听说 data tables 在处理大量数据时显着提高了计算时间 因此想看看 data table 是否能够帮助加快 rollapply 函数的速度 如果我
  • Rails 3 link_to 路由(编辑)嵌套资源

    抱歉 如果其他地方有人问过这个问题 但我无法弄清楚 我有一个包含版块 主题和回复的论坛 我正在尝试从显示主题视图中编辑和删除回复 这是结构 resources sections do resources topics do resource
  • 如何将静态二维数组的指针传递给结构/类?

    当我尝试将数组的指针 其中包含程序中某些函数所需的参数 传递给结构时遇到问题 然后该结构应该传递给这些函数 例如 GSL 希望我以这种方式传递参数 一个小示例程序如下所示 include
  • 如何展开使用 R 中的 igraph 包制作的社区图

    尝试在推文数据中查找社区 不同单词之间的余弦相似度形成邻接矩阵 然后 我根据该邻接矩阵创建了图 图表的可视化是这里的任务 Document Term Matrix dtm DocumentTermMatrix tweets adjust t
  • 对静态文件的请求正在命中 ASP.NET MVC3 中的托管代码

    创建自定义 IHttpModules 时 我意识到对静态文件 例如 css 和 js 文件 的请求正在访问托管模块 可能图片也有同样的问题 IIS 不应该绕过 ASP NET 来获取文件系统中存在的文件吗 例如 public class M
  • 如何将字符串中的空格分隔数字序列转换为整数

    我正在尝试使用将字符串元素转换为整数stoiC 11 中的函数并将其用作参数pow函数 像这样 include
  • Android应用程序更新通知

    我一个月前将我的应用程序上传到 Android 市场 现在我已经上传了它的新版本 我的设备上安装了旧版本 但我没有收到更新通知 当我将应用程序更新到 Android Market 时 是否有任何选项可以向用户发送更新通知 不是默认情况下 市
  • 我应该通过任何方式避免 Django 中的多表(具体)继承吗?

    许多经验丰富的开发人员建议不要使用Django多表继承由于其性能不佳 Django 陷阱 具体继承 by 雅各布 卡普兰 莫斯 Django 的核心贡献者 几乎在所有情况下 抽象继承都是更好的方法 长期来看 我见过不少网站在负载下崩溃了 通