创建另一个表和在 postgres 中使用数组有什么区别

Ake*_*han 4 arrays postgresql database-design denormalization

在我的大学里,我的任务是创建一个简单的大学数据库,其中包含一些表,如学生、部门等。当我处理学生和班级之间的关系时,有一个有趣的时刻,一个学生可以选择多个班级,我被教导要创建带有两个 FK 的第三个表,它应该看起来像这样 Adam(id - 1) 参加了数学课程(id - 5),在第三个表中,记录将是 (1, 5),这里有一个问题为什么我们是否应该更喜欢第三个表而不是数组,对我来说,将学生的班级作为学生表中的附加列看起来更容易。这是一个例子,想象一下学生表(id, name, age, arrayOfClassesID) (1, Adam, 20, [1,8,9,6,7])

PS这不是我的作业,我已经做过了,但这对我来说真的很有趣

Lau*_*lbe 6

从理论上来看,一个问题是这样的设计违反了第一范式。这具有实际影响:

  • 正如 a_horse_without_name 所评论的,第一个问题是不能对数组元素进行外键约束。

  • 快速搜索的索引只能以有限的方式使用 GIN 索引和@>运算符。LIKE使用或 的搜索>无法优化。

  • 即使使用 GIN 索引,搜索某个班级的所有学生效率也会较低,而且查询会更加复杂且不太直观。

  • 如果您想删除学生的班级,则必须重写整个数组。这在这里可能不是什么大问题,但对于更长的阵列来说可能会造成伤害。

使用映射表是在关系数据库中执行此操作的自然方法。