首页 > 解决方案 > 在 postgres 中创建另一个表和使用数组有什么区别

问题描述

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

PS这不是我的功课,我已经完成了,但对我来说真的很有趣

标签: arrayspostgresqldatabase-designdenormalization

解决方案


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

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

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

  • 即使使用 GIN 索引,搜索所有学生的课程效率也会降低,并且查询会更复杂且不太直观。

  • 如果要删除学生的课程,则必须重写整个数组。这在这里可能不是什么大问题,但是对于更长的阵列,它可能会受到伤害。

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


推荐阅读