有人可以举例说明多对多关系吗?

时间:2018-07-22 09:27:15

标签: sql database

我在大学期间了解了许多关系,但我从未真正理解它们。到目前为止,我一直在处理易于理解和处理的一对多关系。

有人可以举一个多对多关系的实际例子,并解释为什么我们需要一个用于多对多关系的桥接表。另外,您是否还需要一对多关系的桥接表?据我了解,您不需要一对多关系的桥梁,但我的一个朋友最近告诉我。

3 个答案:

答案 0 :(得分:2)

One-to-manymany-to-many关系不是数据的属性,而是关系本身。是的,在完善的规范化RDBMS世界中,您确实需要{/ {1}}关系的桥接/第三张表。让我们用现实生活中的例子看一下它们:

  

一对多关系:表A的一行可以链接到表B的一行或多行时。   

现实生活中的例子:汽车制造商制造了多个模型的汽车,但是两个制造商不能制造相同的模型。

数据模型

enter image description here

  

多对多关系:当表A的一行可以链接到表B的一个或多个行时,反之亦然。   

真实生活示例:一个用户可以属于多个社区,一个社区可以有多个用户。

数据模型

enter image description here

答案 1 :(得分:1)

这个问题很古老,但是可以在Instagram之类的社交网络中找到一个实际的例子:

您(跟随者)跟随人A(跟随者)。 您还跟随人B,人C等...,但是您不是唯一可以跟随人A的人,也不是唯一可以跟随人B,C等人的人。您的朋友或其他人也可能也会关注他们。

因此,您最终得到的数据具有以下形式:

users

这就是您所说的桥接表(又称查找表),它描述了多对多关系。

继续以社交网络为例,您需要一个多对多桥接/查找表,否则您将不得不在You表中引入冗余,因为您需要复制Your friend记录您的每个跟随者(ABC)以及您朋友(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的上下文中。无需桥接表即可表示多对多,但在这一点上,我认为这是高级主题。