我在大学期间了解了许多关系,但我从未真正理解它们。到目前为止,我一直在处理易于理解和处理的一对多关系。
有人可以举一个多对多关系的实际例子,并解释为什么我们需要一个用于多对多关系的桥接表。另外,您是否还需要一对多关系的桥接表?据我了解,您不需要一对多关系的桥梁,但我的一个朋友最近告诉我。
答案 0 :(得分:2)
One-to-many
和many-to-many
关系不是数据的属性,而是关系本身。是的,在完善的规范化RDBMS世界中,您确实需要{/ {1}}关系的桥接/第三张表。让我们用现实生活中的例子看一下它们:
一对多关系:表A的一行可以链接到表B的一行或多行时。
现实生活中的例子:汽车制造商制造了多个模型的汽车,但是两个制造商不能制造相同的模型。
多对多关系:当表A的一行可以链接到表B的一个或多个行时,反之亦然。
真实生活示例:一个用户可以属于多个社区,一个社区可以有多个用户。
答案 1 :(得分:1)
这个问题很古老,但是可以在Instagram之类的社交网络中找到一个实际的例子:
您(跟随者)跟随人A(跟随者)。 您还跟随人B,人C等...,但是您不是唯一可以跟随人A的人,也不是唯一可以跟随人B,C等人的人。您的朋友或其他人也可能也会关注他们。
因此,您最终得到的数据具有以下形式:
users
这就是您所说的桥接表(又称查找表),它描述了多对多关系。
继续以社交网络为例,您需要一个多对多桥接/查找表,否则您将不得不在You
表中引入冗余,因为您需要复制Your friend
记录您的每个跟随者(A
,B
,C
)以及您朋友(getApplicationDocumentsDirectory()
)的记录,这当然是不切实际的,并且违反了规范化。 / p>
您是否也需要一对多关系的桥接表?据我了解,您不需要一对多关系的桥梁,但是我的一个朋友最近告诉我。
例如,出于灵活性目的,您可以将桥接/查找表用于一对多关系。您事先不知道数据的关系是有效的多对多关系还是关系是一对多,但您认为数据将来会发展并变成多对多关系。
答案 2 :(得分:0)
一个多对多实例是一所大学开设的课程。您可能有一个课程表,例如:
CourseId | CourseName
=====================
1 | Algebra 101
2 | Intro to Calculus
3 | Advanced C++
4 | Go Programming
...
还有学生:
StudentId | Name
===========================
1 | John Doe
2 | Frank Smith
3 | Mary Brown
...
现在,如果考虑到这一点,一个学生可以参加多门(许多)课程,而一个课程可以有很多随行学生。构成了学生(许多)对(许多)课程的关系。没有桥接表就无法直接表达这一点(我躺在这里,但是没有),因此您要创建中间的第三个表:
学生课程
StudentID | CourseID
====================
1 | 1
1 | 3
2 | 2
2 | 4
2 | 1
3 | 2
3 | 4
我们在说:
John Doe (1) is taking (Algebra 101 and Advanced C++),
Frank Smith (2) is taking (Algebra 101, Intro to Calculus and Go Programming)
Mary Brown (3) is taking (Intro to Calculus and Go Programming)
从学生的角度看,这就像一对多。我们也可以从“课程”的角度来看:
Algebra 101 members are (John Doe and Frank Smith)
Intro to Calculus members (Frank Smith and Mary Brown)
Advance C++ members (John Doe)
Go Programming (Frank Smith and Mary Brown)
从另一端制作另一个“一对多”。
IOW看起来像:
Student +-< Courses and Students >-+ Course
Courses >-< Students
多对多桥接表不必仅具有两个表的ID。至少是您所需要的,但如果需要,可能还会有其他列:
StudentId | CourseID | RegistrationDate | CompletionScore
=========================================================
1 | 1 | 2017/02/15 | A+
1 | 3 | 2017/04/07 | NULL
一对多表没有桥接表。一个典型的例子是客户和订单。一个客户可以有(许多)订单,但是一个订单属于一个(一个)客户。订单表本身直接具有指向其所属客户的外键(CustomerId),因此没有桥表。
注意:这些是在传统RDBMS的上下文中。无需桥接表即可表示多对多,但在这一点上,我认为这是高级主题。