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