2012-01-14 32 views
0

我想加快我的Django应用程序。我注意到的一个问题是,对外键关系的反向查找似乎效率不高。这个技巧会加速Django的ForeignKey查找吗?

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

查询哪个学生有X教师时,必须扫描Student表的所有行以获取整个查询集,这看起来效率不高。

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

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

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

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

+0

无论如何不要重新编制索引!数据库针对在此发生的扫描进行了优化。这只有在你不检索相应的学生原料时才有意义,只能使用它们的ID(我认为这不是很有用!) – Stefano 2012-01-15 12:19:09

回答

1

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

由于文档说:

Django的组成提供了抽象的方式,通过特殊的普通非规范化从 你在简单的声明方式模型的数据型号为 的字段名为CompositionField。

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

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

+0

谢谢!那是我的目标。 – dangerChihuahua007 2012-01-16 03:41:38

2

我不确定,但看起来不对。因为你会让每个学生都有一些ID--这对于数据库来说是N个任务,其中N是一个教师的学生数量,而你可以通过teacher_id来过滤学生,并且它将对整个学生进行单个任务。
它可以依靠从数据库索引,但它会是相同的“从‘学生’SELECT ...”

1

而不是试图破解数据库层进行额外的元数据数据库,为什么不创建一个数据库中是否有适当的索引,或者如果没有帮助,请使用视图或存储过程的某种组合,并使用原始sql查询来调用它?