首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理sql查询中的多对多关系

处理sql查询中的多对多关系
EN

Stack Overflow用户
提问于 2020-12-11 18:33:05
回答 2查看 470关注 0票数 0

因此,正如您在数据建模中所知道的,多对多关系是通过创建桥接表来处理的。这将使我们能够有外键约束。

我的问题与从具有多对多关系的表中查询数据有关。

我将举一个例子。假设我们有下面的表

表1

代码语言:javascript
复制
Column 1
Column 2
Column 3

表2

代码语言:javascript
复制
Column 1
Column 4
Column 5

表3(桥接表)

代码语言:javascript
复制
Column 1

好的,当我试图查询表1中的数据,并离开与表2的连接时,我得到了与表左连接与表3,左连接与表2的查询数据相同的结果。这让我想知道,桥接表是否是SQL查询中必须包括的步骤!

提前感谢您:)

EN

回答 2

Stack Overflow用户

发布于 2020-12-11 18:42:52

您的桥接表只有一列,这表明您混淆了一对多关系(或多个一对一关系)和多对多关系。

在一对多关系中,子表直接引用父表,不需要桥接表:

代码语言:javascript
复制
create table orders (
    order_id int primary key,
    order_date date,
    ...
);

create table order_items (
    order_item_id int primary key,
    order_id int references orders(order_id),
    ...
)

在多对多关系中,桥接表至少有两列,关系中起作用的每个引用表各有一列:

代码语言:javascript
复制
create table authors (
    author_id int primary key,
    name varchar(50),
    ...
);

create table books (
    book_id int primary key,
    title varchar(50),
    ...
);

create table book_authors (
    author_id int references authors(author_id),
    book_id int references books(book_id),
    primary key (author_id, book_id)
)
票数 1
EN

Stack Overflow用户

发布于 2020-12-11 18:50:05

让我们让你的例子不那么抽象。有不喜欢和喜欢的帖子。表1=喜欢,表2=不喜欢。

  • 表喜欢(post_id,谁,为什么)
  • 表不喜欢(post_id,谁,为什么)

然后,桥接表

  • 表发布(post_id,内容)

这是一个示例,其中两个子表由一个父表关联。创建桥接表并不是为了获得两个子表之间的m:n关系,而是因为子表没有父表就没有意义。子表是m:n相关的,但我们通常不把这种关系称为m:n关系,因为这些表只是紧密相关的( like属于一篇文章,而dislike属于一篇文章,但like并不真正属于dislike)。

当谈论m:n关系时,我们通常不谈论父/子关系。

例如:一个订单可以包含多个产品,一个产品可以包含多个订单。

  • 表订单(order_id,日期)
  • 表产品(product_id,名称,价格)

桥接表是按顺序排列的位置:

  • 表order_detail (order_id,product_id,amount)

orders和products之间没有父/子关系,但这两者是相关的,因为产品是订购的。这就是我们通常所说的m:n关系。桥接表建立了订单和产品之间的关系。

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

https://stackoverflow.com/questions/65249641

复制
相关文章

相似问题

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