我正在尝试加速我的Django应用程序。我注意到的一个问题是外键关系的反向查找似乎没有效率。
例如,想象一下教师可以拥有许多学生的情景,但学生只能拥有一名教师。可以将ForeignKey分配给将每个学生与教师相关联的学生。在学生的SQL表中,名为teacher_id
的列会跟踪学生所在的教师。
在查询哪些学生拥有教师X时,必须扫描学生表的所有行以获取整个查询集,这似乎效率低下。
如果我对Django进行编程,以便每次将教师分配给学生时,教师表中的条目,student_id_list
都会更新;学生的ID将附加到以逗号分隔的其他学生ID列表中。
这样,当查询搜索教师的所有学生时,我可以使用这个逗号分隔的学生ID列表来查找学生,这很快(ID是主键)和高效(不是每行必须扫描学生表。)
仍然会使用Student表中的teacher_id列;数据只会存储两次。
这会让我的申请更快吗?谢谢!
答案 0 :(得分:2)
我不确定,但看起来错了。因为你会得到每个学生都有一些身份证 - 这将是N个任务到数据库,其中N是一个教师的学生数,而你可以通过teacher_id过滤学生,这将是对一大批学生的单一任务。
它可以取决于数据库中的索引,但它将是“从'学生'中选择......”
答案 1 :(得分:1)
不是试图破解数据库层以在数据库中携带额外的元数据,为什么不在数据库中创建适当的索引,或者如果没有帮助,请使用视图的某种组合或存储过程,并使用原始SQL查询来调用它?
答案 2 :(得分:1)
据我所知,您希望对数据库方案进行非规范化以获得最佳查询性能。在这种情况下,我可以推荐专门为此目的而设计的应用程序 - django-composition
正如文件所说:
django-composition提供了从中反规范化数据的抽象方法 您的模型通过特殊的通用模型以简单的声明方式 字段名为CompositionField。
大多数数据非规范化的情况都很常见 django-composition有几个处理最多的“捷径”字段 他们。
CompositionField是django模型字段,提供数据接口 反规范化。