创建另一个 table 和在 postgres 中使用数组有什么区别
what is difference between creating another table and using arrays in postgres
在我的大学里,我接到了一个任务,要创建一个简单的大学数据库,其中包含一些 table,例如学生、院系等。有一个有趣的时刻,我在处理学生和 [=22] 之间的关系时=],一个学生可以选择多个 类,我被教导用两个 FK 创建第三个 table,它应该看起来像这样 Adam(id - 1) takes math course(id - 5)在第三个 table 中,记录将是 (1, 5),这是一个问题,为什么我们更喜欢第三个 table 而不是数组,对我来说,保持学生的 [= 看起来更容易22=] 作为学生 table 中的附加列。这是一个例子,假设学生 table (id, name, age, arrayOfClassesID) (1, Adam, 20, [1,8,9,6,7])
.
P.S。这不是我的功课,我已经完成了,但对我来说真的很有趣
从理论上讲,一个问题是这样的设计违反了第一范式。这具有实际影响:
正如 a_horse_without_name 评论的那样,第一个问题是您不能对数组元素进行外键约束。
用于快速搜索的索引只能以有限的方式使用 GIN 索引和 @>
运算符。无法优化 LIKE
或 >
的搜索。
在所有学生中搜索一个class效率会降低,即使有GIN索引,查询也会更复杂,更不直观
如果要删除学生的 class,则必须重写整个数组。这在这里可能不是什么大问题,但是对于更长的数组,它可能会造成伤害。
使用映射 table 是在关系数据库中执行此操作的自然方式。
在我的大学里,我接到了一个任务,要创建一个简单的大学数据库,其中包含一些 table,例如学生、院系等。有一个有趣的时刻,我在处理学生和 [=22] 之间的关系时=],一个学生可以选择多个 类,我被教导用两个 FK 创建第三个 table,它应该看起来像这样 Adam(id - 1) takes math course(id - 5)在第三个 table 中,记录将是 (1, 5),这是一个问题,为什么我们更喜欢第三个 table 而不是数组,对我来说,保持学生的 [= 看起来更容易22=] 作为学生 table 中的附加列。这是一个例子,假设学生 table (id, name, age, arrayOfClassesID) (1, Adam, 20, [1,8,9,6,7])
.
P.S。这不是我的功课,我已经完成了,但对我来说真的很有趣
从理论上讲,一个问题是这样的设计违反了第一范式。这具有实际影响:
正如 a_horse_without_name 评论的那样,第一个问题是您不能对数组元素进行外键约束。
用于快速搜索的索引只能以有限的方式使用 GIN 索引和
@>
运算符。无法优化LIKE
或>
的搜索。在所有学生中搜索一个class效率会降低,即使有GIN索引,查询也会更复杂,更不直观
如果要删除学生的 class,则必须重写整个数组。这在这里可能不是什么大问题,但是对于更长的数组,它可能会造成伤害。
使用映射 table 是在关系数据库中执行此操作的自然方式。