多对多与带过滤的外键的性能

Performance of ManyToMany vs ForeignKey with filteration

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

第一:在教师中有一个 ManyToManyField class。因此,要访问带教师的学生,我将访问 'students' 字段。

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


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

其次:我把老师作为外键放在学生中class。要检查老师的学生,我将使用 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)

哪个总体上更好,尤其是在数据库 (PostgreSQL) 方面。假设我有 100 万名学生和 10 万名教师。

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

最佳

提供的两个选项并不等同。第一个选项是 many-to-many 关系(每个学生可以有很多老师,每个老师可以有很多学生),而第二个选项代表 one-to-many 关系(每个学生只能有一个老师)。

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

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