arrays - 在 postgres 中创建另一个表和使用数组有什么区别
问题描述
在我的大学里,我的任务是创建一个简单的大学数据库,其中包含一些表,如学生、部门等。有一个有趣的时刻,我在处理学生和班级之间的关系,一个学生可以选择多个班级,我被教导要用两个 FK 创建第三个表,它应该看起来像这个 Adam(id - 1) 参加数学课程 (id - 5),在第三个表中,记录是 (1, 5),这是一个问题,为什么我们是否应该更喜欢第三张表而不是数组,对我来说,将学生的班级作为学生表中的附加列看起来要容易得多。这是一个例子,想象一下学生表(id, name, age, arrayOfClassesID) (1, Adam, 20, [1,8,9,6,7])
。
PS这不是我的功课,我已经完成了,但对我来说真的很有趣
解决方案
从理论的角度来看,一个问题是这样的设计违反了第一范式。这具有实际影响:
正如 a_horse_without_name 评论的那样,第一个问题是您不能对数组元素进行外键约束。
快速搜索的索引只能以有限的方式使用 GIN 索引和
@>
运算符。带有LIKE
或>
无法优化的搜索。即使使用 GIN 索引,搜索所有学生的课程效率也会降低,并且查询会更复杂且不太直观。
如果要删除学生的课程,则必须重写整个数组。这在这里可能不是什么大问题,但是对于更长的阵列,它可能会受到伤害。
使用映射表只是在关系数据库中执行此操作的自然方式。
推荐阅读
- postgresql - Sequelize - 查询包含 belongsToMany 或 hasMany
- php - DYLD,[0x1] 库丢失
- javascript - 带有打字稿的枚举
- python - Pygame:如何在 pygame 中插入精灵而不是绘制我的角色
- spring-cloud - 我可以在测试环境中禁用 spring.cloud.sqs 吗?
- reactjs - PC上的Material UI Card Size在手机上是不同的
- html - 堆叠元素混合混合模式 [Safari]
- excel - Excel VBA根据单元格值隐藏按钮
- c# - 如何将特定属性包含到更改部分 Audit.Net
- python - Python 属性装饰器和昂贵的计算