这个技巧会加速Django ForeignKey查找吗?

时间:2012-01-14 21:21:10

标签: django

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

例如,想象一下教师可以拥有许多学生的情景,但学生只能拥有一名教师。可以将ForeignKey分配给将每个学生与教师相关联的学生。在学生的SQL表中,名为teacher_id的列会跟踪学生所在的教师。

在查询哪些学生拥有教师X时,必须扫描学生表的所有行以获取整个查询集,这似乎效率低下。

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

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

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

这会让我的申请更快吗?谢谢!

3 个答案:

答案 0 :(得分:2)

我不确定,但看起来错了。因为你会得到每个学生都有一些身份证 - 这将是N个任务到数据库,其中N是一个教师的学生数,而你可以通过teacher_id过滤学生,这将是对一大批学生的单一任务。
它可以取决于数据库中的索引,但它将是“从'学生'中选择......”

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

正如文件所说:

  

django-composition提供了从中反规范化数据的抽象方法   您的模型通过特殊的通用模型以简单的声明方式   字段名为CompositionField。

     

大多数数据非规范化的情况都很常见   django-composition有几个处理最多的“捷径”字段   他们。

     

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