【问题标题】:Performance of ManyToMany vs ForeignKey with filteration多对多与外键过滤的性能
【发布时间】:2022-01-23 12:58:41
【问题描述】:

我正在从事一个 DRF 项目,我对这两种选择之间的性能有疑问:

首先:在 Teacher 类中有一个 ManyToManyField。因此,要通过教师访问学生,我将访问“学生”字段。

class Student(models.Model):
    ... student data ...


class Teacher(models.Model):
    students = models.ManyToManyField(Student)

第二个:我把老师作为Student类的ForeignKey。要检查老师的学生,我将使用 Student.objects.filter(teacher__id=id)

class Teacher(models.Model):
    ... teacher data ...


class Student(models.Model):
    teacher = models.ForeignKey(Teacher, on_delete=models.SET_NULL)

总体而言哪个更好,尤其是对于 DB (PostgreSQL)。假设我有 100 万学生和 10 万教师。

注意:这只是我真正问题的一个例子。我的代码比这大得多我不想开始复制所有内容,因为我的问题只是关于性能。假设每个学生只能有一个老师,而一个老师可以有多个学生。

最好的

【问题讨论】:

  • 哪种 SQL 表结构最能代表模型? Django 模型只是对此类的一些抽象。
  • 也许考虑一下:如果一个学生有 4 门课程,由 3 位不同的老师教授(一位老师教授两门课程),会发生什么?如果课程在学期中途更换老师会怎样?
  • @user2864740 感谢您的回答。这只是我真正问题的一个例子。我的代码比这大得多,我不想开始复制所有内容。假设每个学生只能有一个老师,而一个老师可以有多个学生。 1 还是 2 哪个更好?最佳
  • 如果一个学生“只能有一个老师,一个老师可以有多个学生”,那么只有一个模型准确地描述了规则——M个学生(FK) : 1 老师。 (每个 M:1 可以 被建模为一个有限制的 M:M,尽管这不是一个上帝的描述。)我怀疑这个 M:1 规则,以及由此产生的模型,很可能是一个整体设计有问题..

标签: postgresql django-models django-rest-framework


【解决方案1】:

提供的两个选项不等效。第一个选项是多对多关系(每个学生可以有很多老师,每个老师可以有很多学生),第二个选项代表一对多关系(每个学生只能有一个老师)。

所以,这两种数据方案解决了不同的问题。

但是如果你想谈论性能,如果实施得当,你应该不会觉得这些限制有太大差异。

【讨论】:

  • 感谢您的回答。这只是我真正问题的一个例子。我的代码比这大得多,我不想开始复制所有内容。假设每个学生只能有一个老师,而一个老师可以有多个学生。 1 还是 2 哪个更好?最佳
  • 如果每个学生只能有一个老师,那么当然,您不需要在数据库中创建中间表并导致额外连接的多对多关系。所以,一般来说,在这种情况下,第二种解决方案更好。
  • 第二个选择更好,即使每次要让老师的学生我必须从 1M 中过滤掉大约 100 个学生?谢谢
  • @OsamaAbuhamdan 在多对多关系中没有任何好处,所以,是的,第二种选择更好,也是最适合您的情况的解决方案。
  • @OsamaAbuhamdan 我建议你发现文档,尤其是关于在 Django 中使用外键的文档(如果你在 @987654324 中指定了相应的 related name,你可以通过 teacher.students 获取老师的学生) @) 和 prefetch_related(它可以帮助您提高性能)。
猜你喜欢
  • 2014-06-11
  • 2014-09-15
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2020-05-01
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多