gpt4 book ai didi

sql-server - 如何在 SQL Server 中为多对多关系建模?

转载 作者:行者123 更新时间:2023-12-01 12:48:23 27 4
gpt4 key购买 nike

我需要在 SQL Server 数据库中的两个表之间引入多对多关系,这两个表都有一个整数作为主键。这在 T-SQL 中如何最好地完成?

考虑以下两个示例表定义,它们应该存在多对多关系:

CREATE TABLE [dbo].[Authors] (
[Id] INT IDENTITY (1, 1) NOT NULL,
CONSTRAINT [PK_Versions] PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[Books] (
[Id] INT NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

最佳答案

传统方式是使用额外的 many:many (junction) 表,它链接到两个表:

CREATE TABLE [dbo].[AuthorsBooks] (
-- Optionally, we can give the table its own surrogate PK
[Id] INT IDENTITY(1,1) NOT NULL,
AuthorId INT NOT NULL,
BookId INT NOT NULL,

-- Referential Integrity
FOREIGN KEY(AuthorId) REFERENCES Authors(Id),
FOREIGN KEY(BookId) REFERENCES Books(Id),

-- PK is either the surrogate ...
PRIMARY KEY CLUSTERED ([Id] ASC)
-- ... Or the compound key
-- PRIMARY KEY CLUSTERED (AuthorId, BookId)
);

一个有争议的问题是您是否想要复合键 AuthorId, BookId成为主键,或者是否添加您自己的新代理 - 这通常是一种主观偏好。

需要考虑是否为 Junction 表使用复合主键或新代理键的一些要点:
  • 如果没有代理,链接到联结表的外部表将需要存储两个复合键(即需要同时保留 AuthorIdBookId 作为外键)。
  • 因此,新代理提供了更窄主键的潜在好处,这意味着链接到此联结表的任何表都将具有一个更窄的外键。
  • 但是,使用复合键,可以优化表可以直接连接到基础 Books 的好处。或 Authors表而无需先加入联结表。

  • 下图希望能让复合键的情况更清晰(中间表 NationalityPersonCountry 的连接表):

    Composite Foreign Key

    编辑

    用法很简单 - 如果链接存在于 many:many 表中,则认为该关系存在。要测试是否存在,您可以通过链接表“加入”,例如
    -- Find all books written by AuthorId 1234
    SELECT b.*
    FROM Books b
    INNER JOIN AuthorsBooks ab
    ON b.Id = ab.BookId
    WHERE ab.AuthorId = 1234;

    关于sql-server - 如何在 SQL Server 中为多对多关系建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13970628/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com