SQL - 使用 ORM 时,有时不对 many_to_many 关系使用枢轴 table 是否有意义?

SQL - When using an ORM, does it sometimes make sense to not use a pivot table for many_to_many relationships?

对于以下假设的用例,我试图理解为什么可能需要一个支点 table 而不是替代解决方案(如下所述)。

假设用例

假设一部电影有很多演员,一个演员可以属于不止一部电影。

“标准”枢轴 Table 解决方案

如本 lesson (using Elixir's Ecto library) 所述,“标准”解决方案建议使用 movies_actors 枢轴 table,moviesactors tables 引用此 movies_actors table.

备选方案

相反,我们可以通过 ID 列表的概念来实现相同的结果吗?

问题

一种解决方案更可取吗?为什么?

您所指的 table 通常称为“交汇点”table 或“关联”table。这是实现 many-to-many 关系的标准方式。

Junction tables 有一些关键优势。值得注意的是,当正确定义外键时,它可以保证数据完整性。

但这不是你的问题。在某些情况下其他表示是否合适?我会说 Postgres 通过数组和 JSON 提供了强大的功能,这使得它们对于 many-to-many 关系是可行的。特别是,Postgres 支持数组索引和 JSON,克服了这种关系的一大障碍。

这样的列表什么时候合适?我认为它不适合 Actors。这本身就是一个实体,您需要有关演员的许多其他信息。

但它可能适用于 user-generated 标签之类的内容,尤其是您认为不需要维护主列表(并且不关心拼写错误)的标签。它可能适用于某些东西的替代名称(假设您不希望跨行使用不相交的名称)。

我认为您不应该使用存储引用 id 数组的“替代解决方案”来模拟 many-to-many 关系。乍看简单,后面会伤到你。

您应该为这两种情况编写一个简单的测试用例,并创建具有实际数量的条目和关系的测试表(如果数据是人工的和重复的则无关紧要)。然后尝试在两个表之间编写连接。您会发现使用“替代解决方案”,查询看起来复杂得多(充其量,它会涉及像 @> 这样的奇怪运算符)并且性能不佳(您只能获得嵌套循环连接) .

将数据保存在 first normal form 中是有充分理由的——它更适合关系数据库处理数据的方式。

当然,必须对这种“正常形式”的东西持保留态度:使用数组来存储数据很好,只要您不在查询处理中使用单独的数组条目即可。但是通过连接数组元素,您肯定会越过那条线。