同一个表之间有多个多对多的关系,或者一个n:m与标识属性的关系?

时间:2011-03-28 22:47:45

标签: sql join many-to-many

目前我在2个表之间有多个n:m关系:

Users --> Favourites(user_id,post_id) <-- Posts
Users --> Follow(user_id,post_id)     <-- Posts

您是希望有2个连接表还是只有一个连接表,其中的属性标记了连接的类型,所以类似于:

Users --> Users_Posts (user_id,post_id,type(VALUES="favourite,follow") <-- Posts

这与我在我的应用程序中的示例不完全相同,但我认为您可以理解。

1 个答案:

答案 0 :(得分:1)

我认为这里没有一个“正确”的答案。我认为取决于。如果您使用具有“关系类型”列的单个表并且经常只想提取单个类型的关系 - 比如只是收藏夹 - 则针对该表的每个查询都需要应用WHERE子句来过滤掉您的类型想要。如果您没有正确索引非键“关系类型”列,那么这可能会导致查询速度变慢。此外,它使未来的开发人员总是需要知道并记住过滤他们想要的类型,或者他们可能意外地获得他们不想要的关系数据。有两个单独的表更容易理解。例如,我更容易快速了解“收藏夹”表中的内容而不是“Users_Posts”表中的内容,因此单独的表可以更快地传达差异。

另一方面,如果您经常需要在单个集合中选择两个关系类型,那么将它们放在单个表中会更简单,因为您不必担心执行UNION将两个表中的数据合并到一个视图中。如果有10,000种不同的可能关系类型怎么办?您想要10,000张不同的桌子,还是更喜欢单张桌子?在这种情况下,大多数人更喜欢单一的桌子。

所以我认为这取决于许多因素,例如预期用法,大小等。“正确”的答案更多的是艺术而非科学。