什么是多对多关系?

时间:2015-06-30 02:46:15

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

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

学校的学生有很多俱乐部。学校的一个俱乐部有很多学生。让我们说学生有很多属性:名字,姓氏,电话,年龄,电子邮件等。俱乐部只有一个属性:名字。

当我建立一个新俱乐部时,我希望能够给俱乐部一个名字和一个或多个学生。在成立俱乐部后,我希望该俱乐部与那些学生和那些与该俱乐部有联系的学生联系起来。

当我开设新学生时,我希望能够给学生一个名字,姓氏等,以及一个或多个俱乐部。在培养学生时,我希望该学生与那些俱乐部相关联,并希望那些俱乐部与该学生联系。

我还想在他们的节目页面上展示俱乐部的学生和学生俱乐部。

我已经读过,当你有一个连接表可以访问生成的学生和俱乐部的常用属性时,多对多的关系,但我的情况下没有共同的属性。

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

3 个答案:

答案 0 :(得分:3)

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

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

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

现在接下来的是定义学生和俱乐部实际上是什么,你已经做过。

学生是名字,姓氏等的组合......你没有指定的是学生独特的原因。俱乐部也必须定义什么才能让它变得独一无二。虽然出于学术目的,你可以说这个名字是真实的,它可能不是最好的解决方案。

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

您创建了第3个表,它创建了“多对多”关系。

在第3个表中,您有2列。一个是学生的唯一索引,另一个是俱乐部的唯一索引。您只需在该表上添加一个条目,您希望将该学生与俱乐部联系起来。

既然你可以让很多学生被分配到同一个俱乐部,并且你可以将多个俱乐部分配给同一个学生,那么你就有很多关系。

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

答案 1 :(得分:2)

你有很多人

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

然后第三个表是结点/交叉表,称之为X。

如果学生有俱乐部ID,则在X中加上学生ID和俱乐部ID,反之亦然。它将在表X中的两个id中具有唯一的复合键。

复合将保证X

中没有重复的行

答案 2 :(得分:0)

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