0

如果一个人有很多帖子,我们可以有一个 People 表和一个 Posts 表。Posts 表中的每个条目都有一个指向 People 条目的键。典型的 has_many 关系。

或者我们可以有一个 People 和一个 Posts 表,以及一个关系表,其中包含来自 People 条目和 Posts 条目的键来连接它们。

似乎两者都是可行的,那么我如何决定选择哪一个而不是另一个?

4

6 回答 6

2

您公开的两个解决方案实际上解决了两个不同的问题:

  • 第一个是关系(指南one to many中的更多信息)。基本上,一个帖子与一个独特的帖子相关联,因此不需要额外的表格。

  • 如果某个帖子可以以某种方式与多个独特的人相关,那么您就有many to many关系(指南中的更多信息)。在这种情况下,join tabe介于posts和之间people可以让您知道哪些人与帖子相关联,哪些帖子与用户相关联。请注意,您也可以使用has_many :through(更多信息在指南中),但这是另一个讨论。

于 2013-03-28T16:31:47.890 回答
1

当您具有“多对多”关系时,您使用第三个表(连接表)。也就是说,一个人可以有很多帖子,一个帖子可以有很多人。

在您的示例中,如果帖子只能属于一个人,则它是“一对多”,您不需要也不应该创建连接表。帖子表中的外键是确保帖子只属于一个人。使用连接表,您可以打破该约束。

于 2013-03-28T16:30:28.893 回答
0

不同之处在于这是两种不同的关系。

  • “has_many”(没有连接表)意味着一个人有很多帖子,一个帖子属于一个唯一的人。
  • “has_and_belongs_to_many”(带有这个连接表)意味着一个人有很多帖子,一个帖子有很多人。

一对多、多对一和多对多的区别?

于 2013-03-28T16:30:36.087 回答
0

您的方法 2(多对多)仅在帖子将有多个作者时才需要,这种情况很少见。

在大多数情况下,您的方法之一就足够了。

于 2013-03-28T16:30:48.677 回答
0

如果你有一个连接表,这通常意味着你在两个模型之间有一个多对多的关系。在您的示例中,这意味着一个帖子可以属于多个用户,一个用户可以属于多个帖子。

如果您不使用连接表,这意味着您在两个模型之间存在一对多或一对一的关系。请看下面的案例:

案例1:帖子中的user_id

这意味着发布belong_to用户。用户可以与帖子建立has_manyhas_one关系

案例2:用户中的post_id

显然,这与案例 1 正好相反。但我必须强调,放置外键的位置对数据库模型至关重要。

于 2013-03-28T16:34:49.173 回答
0

当关联的条目不能在多个所有者之间共享时,您使用“一对多”关系(一个表具有另一个表的外键)。在您的示例中:如果 Post 仅属于一个用户,您将使用这种关系(Posts 表将包含 People 表的外键)。

您将使用关系表来表示“多对多”关系。仍然以您为例,如果一个 People 可以有多个 Posts,并且一个 Post 可以属于多个人(想象一个帖子可以由多个人创建),您将需要第三个表来存储这些关系。此关系表将允许您将多个人员 ID 关联到同一个帖子 ID,或者将多个帖子 ID 关联到同一个人。

问候

于 2013-03-28T16:38:19.963 回答