【问题标题】:Handling many-to-many relationship in a sql query在 sql 查询中处理多对多关系
【发布时间】:2021-03-22 18:26:17
【问题描述】:

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

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

我举个例子。假设我们有以下表格

表 1

Column 1
Column 2
Column 3

表 2

Column 1
Column 4
Column 5

表3(桥表)

Column 1

好的,所以当我尝试查询表 1 中的数据并左连接表 2 时,我得到的结果与左连接表 3 和左连接表 2 的表中的查询数据相同。这让我想知道是否桥接表是包含在 SQL 查询中的必要步骤!

提前谢谢你:)

【问题讨论】:

    标签: sql database-design many-to-many


    【解决方案1】:

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

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

    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),
        ...
    )
    

    在多对多关系中,桥接表有(至少)两列,每一列用于在关系中发挥作用的参考表:

    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)
    )
    

    【讨论】:

    • 感谢您的回答。也许我没有把我的例子说清楚。表 2 和表 3 有 Column 1 的描述信息,每个表都有 Column1 的重复描述行。这里没有事实或维度。为什么表 2 和 3 没有平放在一张表中,因为我有我的理由。通过向您解释这一点,我实际上回答了我的问题:)
    【解决方案2】:

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

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

    然后是桥接表

    • 表格帖子(post_id、内容)

    这是一个示例,其中两个子表由一个父表关联。创建桥接表不是为了在两个子表之间建立 m:n 关系,而是因为子表没有父表就没有任何意义。子表是 m:n 相关的,但我们通常不将其称为 m:n 关系,因为这些表只是失去关联(喜欢属于帖子,不喜欢属于帖子,但喜欢不属于) t真的属于不喜欢)。

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

    一个例子:一个订单可以包含许多产品,一个产品可以包含在多个订单中。

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

    桥表是顺序中的位置:

    • 表order_detail(order_id、product_id、金额)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多