多对多关系:使用数组或创建新表[重复]

Posted

技术标签:

【中文标题】多对多关系:使用数组或创建新表[重复]【英文标题】:Many-to-many relationships: Use arrays or create new table [duplicate] 【发布时间】:2021-12-31 12:18:57 【问题描述】:

Postgresql v. 14

我希望能够以高效且可扩展的方式查询与电影相关的所有类型,我想到了这些方法,需要帮助决定,如果您知道更好的方法,请随时发布。

问题: 我有 2 张桌子。 1 是包含与电影相关的信息的电影,第二个表是流派,其中包含可以添加到电影的流派列表。每部电影可以有 0/null 或许多类型。


解决方案 1: 创建一个名为movie_genre 的新表,它引用movie_id 和genre_id。这需要由触发器维护,以便在插入新电影后保持更新。

解决方案 2: 在电影中创建一个名为流派的新列,其中包含与流派 ID 链接的整数数组,然后我将能够像这样查询流派:

select genre.* from genre join movie on genre.id = any(movie.genres) where movie.id = 1;

您认为哪种方式更明智?想听听你的意见。

【问题讨论】:

选择正确标准化的模型:解决方案 1 您可以简单地删除问题,但请不要破坏它 【参考方案1】:

解决方案 1. 绝对。当表被规范化时,RDBMS 工作得最好。

请不要再考虑解决方案 2。如果你这样做,一年后你的同事和你自己都会诅咒你的名字。

说真的。

【讨论】:

@Renewablezip:为什么需要触发器?如果您创建一个新电影,您应该知道它属于哪个类型,因此只需在单个事务中插入两个表。此外:触发器如何知道电影属于哪种类型? 维护那张额外的桌子很烦人?与搜索具有 IT 主题的恐怖电影相比会有多烦人?说真的,几乎所有具有多对多关系的基于 SQL 的应用程序都使用额外的表,有时称为 JOIN 表。

以上是关于多对多关系:使用数组或创建新表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 中实现多对多关系?

iOS 上的解析平台:大型多对多的关系、联接或数组?

在 Core Data 中替换多对多关系中的实体

hibernate对象关系实现多对多实现

逻辑或 Django 多对多查询返回重复结果

如何为多对多关系创建 UI?