什么是多对多关系?
What is a many to many relationship?
我对什么是多对多关系有点困惑。我想知道以下是否是多对多关系:
一个学校的学生有很多社团。学校的社团有很多学生。假设学生有很多属性:名字、姓氏、phone、年龄、电子邮件等。一个俱乐部只有一个属性:名字。
当我创建一个新的社团时,我希望能够给社团一个名字和一个或多个学生。创建俱乐部后,我希望该俱乐部与那些学生相关联,而那些学生则与该俱乐部相关联。
当我做一个新学生时,我希望能够给学生一个名字,姓氏等,以及一个或多个俱乐部。在制作学生时,我希望该学生与那些俱乐部相关联,而那些俱乐部与该学生相关联。
我还想在他们的展示页面上显示一个俱乐部的学生和一个学生的俱乐部。
我读到多对多关系是指当您有一个连接 table 时,您可以访问生成的学生和俱乐部的共同属性,但在我的例子中没有共同属性。
这里是多对多关系吗?如果是这样,我是通过关系使用 HABTM 还是 has_many?
实际上是的,你们确实有共同的属性。
你自己说一个学生有很多俱乐部
一个俱乐部有很多学生。
有什么共同点?学生和社团。
接下来是定义学生和俱乐部的实际含义,您已经这样做了。
学生是名字、姓氏等的组合...您没有指定的是什么使学生独一无二。俱乐部还必须定义什么才能使其独一无二。虽然出于学术目的,您可以说这个名字使它独一无二,但在现实生活中,这可能不是最好的解决方案。
通常出于性能目的,每个学生都会获得一个唯一的自动增量 ID(这是一个数字)。
俱乐部也可以做同样的事情。
您创建了第三个 table,这就是创建多对多关系的原因。
在第 3 个 table 中,您有 2 列。一列包含学生的唯一索引,另一列包含俱乐部的唯一索引。您只需在 table 上添加一个条目,您希望在其中将学生与俱乐部联系起来。
由于您可以将许多学生分配给同一个俱乐部,并且您可以将多个俱乐部分配给同一学生,所以你们之间存在多对多关系。
编辑:如另一个答案中所述,您的第 3 个 table 还应将组合索引声明为唯一的,这样您就不会多次添加相同的条目。
是的,这里确实存在多对多关系,使用 HABTM。还有,为什么说没有共同的属性呢?俱乐部名称和学生名称在这种情况下肯定是常见的属性。
你有一个多对多
为每个 table 创建一个唯一的 ID table 通常是一个自动递增的 int。
然后第三个 table 是 junction/intersect table 称它为 X。
如果学生有俱乐部,则在 X 中用学生 ID 和俱乐部 ID 填一行,反之亦然。它将在 table X 中的两个 id 中有一个唯一的复合键。
组合将保证 X
中没有重复行
我对什么是多对多关系有点困惑。我想知道以下是否是多对多关系:
一个学校的学生有很多社团。学校的社团有很多学生。假设学生有很多属性:名字、姓氏、phone、年龄、电子邮件等。一个俱乐部只有一个属性:名字。
当我创建一个新的社团时,我希望能够给社团一个名字和一个或多个学生。创建俱乐部后,我希望该俱乐部与那些学生相关联,而那些学生则与该俱乐部相关联。
当我做一个新学生时,我希望能够给学生一个名字,姓氏等,以及一个或多个俱乐部。在制作学生时,我希望该学生与那些俱乐部相关联,而那些俱乐部与该学生相关联。
我还想在他们的展示页面上显示一个俱乐部的学生和一个学生的俱乐部。
我读到多对多关系是指当您有一个连接 table 时,您可以访问生成的学生和俱乐部的共同属性,但在我的例子中没有共同属性。
这里是多对多关系吗?如果是这样,我是通过关系使用 HABTM 还是 has_many?
实际上是的,你们确实有共同的属性。
你自己说一个学生有很多俱乐部 一个俱乐部有很多学生。
有什么共同点?学生和社团。
接下来是定义学生和俱乐部的实际含义,您已经这样做了。
学生是名字、姓氏等的组合...您没有指定的是什么使学生独一无二。俱乐部还必须定义什么才能使其独一无二。虽然出于学术目的,您可以说这个名字使它独一无二,但在现实生活中,这可能不是最好的解决方案。
通常出于性能目的,每个学生都会获得一个唯一的自动增量 ID(这是一个数字)。 俱乐部也可以做同样的事情。
您创建了第三个 table,这就是创建多对多关系的原因。
在第 3 个 table 中,您有 2 列。一列包含学生的唯一索引,另一列包含俱乐部的唯一索引。您只需在 table 上添加一个条目,您希望在其中将学生与俱乐部联系起来。
由于您可以将许多学生分配给同一个俱乐部,并且您可以将多个俱乐部分配给同一学生,所以你们之间存在多对多关系。
编辑:如另一个答案中所述,您的第 3 个 table 还应将组合索引声明为唯一的,这样您就不会多次添加相同的条目。
是的,这里确实存在多对多关系,使用 HABTM。还有,为什么说没有共同的属性呢?俱乐部名称和学生名称在这种情况下肯定是常见的属性。
你有一个多对多
为每个 table 创建一个唯一的 ID table 通常是一个自动递增的 int。
然后第三个 table 是 junction/intersect table 称它为 X。
如果学生有俱乐部,则在 X 中用学生 ID 和俱乐部 ID 填一行,反之亦然。它将在 table X 中的两个 id 中有一个唯一的复合键。
组合将保证 X
中没有重复行