如果一个人有很多帖子,我们可以有一个 People 表和一个 Posts 表。Posts 表中的每个条目都有一个指向 People 条目的键。典型的 has_many 关系。
或者我们可以有一个 People 和一个 Posts 表,以及一个关系表,其中包含来自 People 条目和 Posts 条目的键来连接它们。
似乎两者都是可行的,那么我如何决定选择哪一个而不是另一个?
如果一个人有很多帖子,我们可以有一个 People 表和一个 Posts 表。Posts 表中的每个条目都有一个指向 People 条目的键。典型的 has_many 关系。
或者我们可以有一个 People 和一个 Posts 表,以及一个关系表,其中包含来自 People 条目和 Posts 条目的键来连接它们。
似乎两者都是可行的,那么我如何决定选择哪一个而不是另一个?
当您具有“多对多”关系时,您使用第三个表(连接表)。也就是说,一个人可以有很多帖子,一个帖子可以有很多人。
在您的示例中,如果帖子只能属于一个人,则它是“一对多”,您不需要也不应该创建连接表。帖子表中的外键是确保帖子只属于一个人。使用连接表,您可以打破该约束。
不同之处在于这是两种不同的关系。
您的方法 2(多对多)仅在帖子将有多个作者时才需要,这种情况很少见。
在大多数情况下,您的方法之一就足够了。
如果你有一个连接表,这通常意味着你在两个模型之间有一个多对多的关系。在您的示例中,这意味着一个帖子可以属于多个用户,一个用户可以属于多个帖子。
如果您不使用连接表,这意味着您在两个模型之间存在一对多或一对一的关系。请看下面的案例:
案例1:帖子中的user_id
这意味着发布belong_to
用户。用户可以与帖子建立has_many
或has_one
关系
案例2:用户中的post_id
显然,这与案例 1 正好相反。但我必须强调,放置外键的位置对数据库模型至关重要。
当关联的条目不能在多个所有者之间共享时,您使用“一对多”关系(一个表具有另一个表的外键)。在您的示例中:如果 Post 仅属于一个用户,您将使用这种关系(Posts 表将包含 People 表的外键)。
您将使用关系表来表示“多对多”关系。仍然以您为例,如果一个 People 可以有多个 Posts,并且一个 Post 可以属于多个人(想象一个帖子可以由多个人创建),您将需要第三个表来存储这些关系。此关系表将允许您将多个人员 ID 关联到同一个帖子 ID,或者将多个帖子 ID 关联到同一个人。
问候