【问题标题】:Would this trick speed up Django ForeignKey lookup?这个技巧会加速 Django ForeignKey 查找吗?
【发布时间】:2012-01-15 22:57:03
【问题描述】:

我正在尝试加速我的 Django 应用程序。我注意到的一个问题是外键关系的反向查找似乎效率不高。

例如,假设一个老师可以有很多学生,但一个学生只能有一个老师。可以将 ForeignKey 分配给将每个学生与老师联系起来的学生。在学生的 SQL 表中,名为teacher_id 的列跟踪学生的老师。

查询哪些学生有老师X时,必须扫描Student表的所有行才能得到整个查询集,这样似乎效率低下。

如果我对 Django 进行编程,以便每次将老师分配给学生时,都会更新教师表中的一个条目,例如 student_id_list;该学生的 ID 将附加到其他学生 ID 的逗号分隔列表中。

这样,当查询查找某位老师的所有学生时,我可以使用这个以逗号分隔的学生 ID 列表来查找学生,这样既快速(ID 是主键)又高效(不是每一行必须扫描学生表。)

Student 表中的teacher_id 列仍将被使用;数据只会被存储两次。

这会让我的应用程序更快吗?谢谢!

【问题讨论】:

  • 无论如何不要重新发明索引!数据库针对它在这里发生的那种扫描进行了优化。这只有在你不检索相应的学生原始数据时才有意义,只使用它们的 ID(我认为这不是很有用!)

标签: django


【解决方案1】:

我不确定,但它看起来像是错误的。因为你会得到每个学生都有一些 ID - 这将是对数据库的 N 个任务,其中 N 是一个老师的学生数量,而你可以通过teacher_id 过滤学生,这将是一个针对整个学生数量的单一任务.
它可以依赖于数据库中的索引,但它会是相同的“SELECT from 'students'...”

【讨论】:

    【解决方案2】:

    据我了解,您希望对数据库方案进行非规范化以获得最佳查询性能。在这种情况下,我可以推荐您专门为此目的设计的应用程序 - django-composition

    正如文档所说:

    django-composition 提供了一种抽象的方式来对来自 您的模型通过特殊的通用模型以简单的声明方式 名为 CompositionField 的字段。

    大多数数据非规范化的情况都很常见,所以 django-composition 有几个“快捷方式”字段可以处理大多数 其中。

    CompositionField 是 django 模型字段,提供数据接口 非规范化。

    【讨论】:

      【解决方案3】:

      与其尝试破解数据库层以在数据库中携带额外的元数据,不如在数据库中创建适当的索引,或者如果这没有帮助,请使用视图的某种组合或存储过程,并使用原始 sql 查询来调用它?

      【讨论】: