首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人能举一个多对多关系的实际例子吗?

有人能举一个多对多关系的实际例子吗?
EN

Stack Overflow用户
提问于 2018-07-22 17:27:15
回答 3查看 18.4K关注 0票数 4

我在大学里学到了许多关系,但我从来没有真正理解过它们。到目前为止,我一直在处理一对多的关系,这些关系很容易理解和处理。

谁能举一个多对多关系的实际例子,并解释为什么我们需要一个多对多关系的桥接表。另外,你是否也需要一个一对多关系的桥接表?据我所知,一对多的关系不需要桥接表,但我的一个朋友最近告诉我并非如此。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-22 18:51:03

One-to-many & many-to-many关系不是数据的属性,而是关系本身的属性。是的,在完全规范化的RDBMS世界中,您确实需要桥接/第三个表来处理many-to-many关系。让我们用现实生活中的例子来看看每一个:

one - to - multiple relationship:当表A的一行可以链接到表B的一行或多行时。现实生活示例:一家汽车制造商生产多个车型,但同一车型不能由两个制造商制造。

数据模型

多对多关系链接(

more to -more):表A的一行可以链接到表B的一行或多行,反之亦然。现实生活中的例子:一个用户可以属于多个社区,一个社区可以有多个用户。

数据模型

票数 18
EN

Stack Overflow用户

发布于 2018-07-22 20:04:28

一个多对多的实际例子是在大学里学习的课程。您可能有一个课程表,如下所示:

代码语言:javascript
复制
CourseId | CourseName
=====================
   1     | Algebra 101
   2     | Intro to Calculus
   3     | Advanced C++
   4     | Go Programming
...

这里有学生:

代码语言:javascript
复制
StudentId | Name
===========================
   1      | John Doe
   2      | Frank Smith
   3      | Mary Brown 
...

现在,如果你想一想,一个学生可以选修多个(许多)课程,一个课程可以有许多随行学生。这构成了学生(多)对(多)课程的关系。没有一个桥接表是无法直接表达的(我躺在这里,但接受没有),所以你创建中间的第三个表:

Students_Courses

代码语言:javascript
复制
StudentID | CourseID
====================
    1     |    1
    1     |    3
    2     |    2
    2     |    4
    2     |    1  
    3     |    2
    3     |    4

我们说的是:

代码语言:javascript
复制
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)

这就像从学生的角度看一对多。我们也可以从课程的角度来看:

代码语言:javascript
复制
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)

从另一边进行另一对多。

看起来是这样的:

代码语言:javascript
复制
Student +-< Courses and Students >-+ Course
            Courses >-< Students

多对多桥接表不需要只有来自两个表的ID。它至少是您需要的,但如果您需要以下内容,则可能会有其他列:

代码语言:javascript
复制
StudentId | CourseID | RegistrationDate | CompletionScore
=========================================================
   1      |     1    |  2017/02/15      |      A+
   1      |     3    |  2017/04/07      |  NULL

并且一对多的表没有桥接表。一个典型的例子是客户和订单。一个客户可以有(多个)订单,但一个订单属于一个(一个)客户。Orders表本身直接有一个外键(CustomerId)指向它所属的客户,因此没有桥接表。

注意:这些都是在传统RDBMS的上下文中。多对多可能在没有桥接表的情况下表达,但在这一点上,我假设它是高级主题。

票数 7
EN

Stack Overflow用户

发布于 2020-10-21 05:16:14

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

你( follower)关注一个人A( followee)。你也关注B、C等,但你不是唯一关注A的人,也不是唯一关注B、C等的人。你的朋友或其他人也可以跟随他们。

因此,您最终会得到如下形式的数据:

代码语言:javascript
复制
     Follower | Followee
--------------|--------------
          ... | ...
          You | A
          You | B
          You | C
  Your friend | A
  Your friend | B
  Your friend | C
          ... | ...

这就是你所说的桥接表(也称为查找表),它描述了一个多对多的关系。

继续社交网络示例,您需要一个多对多桥接/查找表,否则您将不得不在users表中引入冗余,因为您将需要为您的每个关注者(ABC)复制您的You记录和您朋友(C)的记录,这当然是不切实际的,并且违反了规范化。

您是否也需要一对多关系的桥接表?据我所知,一对多的关系不需要桥接表,但我的一个朋友最近告诉我并非如此。

当你事先不知道数据的关系是否是有效的多对多关系或者是一对多关系,但你认为它可以在未来发展成为多对多的关系时,你可以为了灵活性的目的而使用一对多关系的桥接/查找表。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51463706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档