【问题标题】:What is a many to many relationship?什么是多对多关系?
【发布时间】:2015-09-16 16:26:13
【问题描述】:

我对什么是多对多关系有点困惑。我想知道以下是否是多对多关系:

一所学校的学生有许多俱乐部。学校的俱乐部有很多学生。假设学生有许多属性:名字、姓氏、电话、年龄、电子邮件等。俱乐部只有一个属性:名字。

当我创建一个新分会时,我希望能够为分会命名和一个或多个学生。在创建俱乐部时,我希望该俱乐部与这些学生相关联,并且这些学生与该俱乐部相关联。

当我创建一个新学生时,我希望能够给学生一个名字、姓氏等,以及一个或多个俱乐部。在创建学生时,我希望该学生与这些俱乐部相关联,并且这些俱乐部与该学生相关联。

我还想在他们的展示页面上显示一个俱乐部的学生和一个学生的俱乐部。

我了解到,多对多关系是指您有一个连接表,可让您访问生成的学生和俱乐部的共同属性,但在我的情况下没有共同属性。

我这里有多对多的关系吗?如果是这样,我是通过关系使用 HABTM 还是 has_many?

【问题讨论】:

    标签: ruby-on-rails many-to-many has-many-through


    【解决方案1】:

    实际上是的,您确实有共同的属性。

    你自己说过一个学生有很多俱乐部 一个俱乐部有很多学生。

    有什么共同点?学生和俱乐部。

    接下来是定义学生和俱乐部实际上是什么,您已经这样做了。

    学生是名字、姓氏等的组合...您没有指定的是使学生唯一的原因。一个俱乐部也必须被定义为怎样才能使它成为独一无二的。虽然出于学术目的,您可以说名称是其独特之处,但在现实生活中,这可能不是最佳解决方案。

    通常出于表现目的,每个学生都有一个唯一的自动增量 ID(它是一个数字)。 俱乐部也可以做同样的事情。

    您创建了第三个表,它创建了多对多关系。

    在第三张表中,您有 2 列。一个具有学生的唯一索引,另一列具有俱乐部的唯一索引。您只需在希望将学生与俱乐部相关联的表格上添加一个条目。

    由于您可以将多个学生分配到同一个俱乐部,并且您可以将多个俱乐部分配给同一个学生,因此您具有多对多关系。

    编辑:正如另一个答案中提到的,您的第三个表还应该将组合索引声明为唯一,这样您就不会多次添加相同的条目。

    【讨论】:

    • 哇,谢谢!这更有意义。我现在对如何制作新学生/俱乐部感到困惑,我该如何处理第三张桌子?以前使用双方的一对多关系,我使用每个学生和俱乐部的 id 作为强参数并将它们保存在一个表格中。但是现在有了第三张桌子,我不确定在这里做什么......
    • 嗯,整个想法是您希望能够将多个学生添加到多个俱乐部。因此,通常您将有一个用于创建俱乐部的表格、一个用于创建学生的表格以及一个用于将学生与俱乐部联系起来的表格。也就是说,一旦你解决了这个问题,你就可以聪明地创建一个界面,以更好的方式将事物联系起来。
    • 将他们联系在一起的表格可以是学生列表和俱乐部列表,从每个列表中选择一个,然后单击按钮通过将值插入第三个表来“加入”它们。如果您曾经在 iPod 设备上创建过播放列表,那基本上就是您正在做的事情。您从选择播放列表开始,然后开始选择您希望与播放列表相关的歌曲。多对多的简单示例,其中歌曲可以在多个播放列表中,而一个播放列表可以包含多首歌曲。
    • 所以你是说我不应该在表格上创建新学生时立即为学生添加俱乐部,而是有另一个表格将两者联系起来?编辑:阅读您的新评论后,我现在明白了,但是有没有办法“在表格上创建新学生时立即向学生添加俱乐部”
    • 是的!但在添加新俱乐部之前,您会检查该俱乐部是否已经存在。如果确实存在,则获取 ID,跳过 Club 插入,然后将插入调用到第 3 个表,所有部分的相同表单调用。你可以对学生做同样的事情(检查他是否存在)。但请注意,人们通常会打错字,因此您可能会多次输入同一个俱乐部/学生,但名称略有错误。
    【解决方案2】:

    是的,这里确实存在多对多关系,请使用 HABTM。另外,为什么说没有共同的属性?在这种情况下,俱乐部名称和学生姓名绝对是常见的属性。

    【讨论】:

      【解决方案3】:

      你有很多对多

      为每个表创建一个唯一的 id,通常是一个自动递增的 int。

      然后是第三个表,它是一个连接/相交表,称之为 X。

      如果学生拥有俱乐部,则在 X 中用学生 ID 和俱乐部 ID 填写一行,反之亦然。它将在表 X 中跨两个 id 有一个唯一的复合键。

      复合将保证 X 中没有重复的行

      【讨论】:

      • 谢谢!现在,当我在控制器/视图中创建一个新学生或俱乐部时,我遇到了如何处理第三张桌子的问题。你能粗略地解释一下吗?或者如果有一些在线资源可以说明控制器/视图具有多通或 HABTM 关系的样子,那就太好了?
      • 请记住,学生和俱乐部可以相交 0 或 1 次,不能再相交。如果 Johnny 退出俱乐部或俱乐部将他踢出局,则删除相交行。所以你需要设计一个 GUI 来做到这一点
      • 我相信您已经在您的操作系统上看到过这样的 GUI。称他们为用户屏幕(您可以添加或删除他们所在的共享)。您会看到“共享”屏幕(添加被授予权限的用户或删除该权限)
      • 您不会在创建学生时将学生添加到组中(并不是说您不能)。反之亦然
      • 非常感谢!我太专注于这样做,但现在我应该将它们单独链接起来更清楚。
      猜你喜欢
      • 2012-11-07
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2021-08-30
      • 1970-01-01
      • 2013-09-15
      相关资源
      最近更新 更多