【发布时间】:2015-03-03 23:22:28
【问题描述】:
我已经阅读了一些似乎使这个问题重复的内容。但是通读所有这些让我不确定。我希望根据下面的绝对示例得到答案,因为许多问题/答案都在来回辩论中逐渐消失。
如果我有:
dbo.Book
--------
BookID PK int identity(1,1)
dbo.Author
----------
AuthorID PK int identity(1,1)
现在对于简单的联结表,我有两种选择:
dbo.BookAuthor
--------------
BookID CPK and FK
AuthorID CPK and FK
以上将是两个 FK 上的复合/复合键,以及为两列设置 FK 关系 - 删除时也使用 Cascade。
或
dbo.BookAuthor
--------------
RecordID PK int identity(1,1)
BookID FK
AuthorID FK
BookID 和 AuthorID 上的外键关系,以及删除时的 Cascade。还要对 BookID 和 AuthorID 设置唯一约束。
我正在寻找一个简单的答案,说明为什么在上述特定示例中一种方法优于另一种方法。我正在阅读的答案非常详细,我正要确定一个复合键,但随后观看了一个视频,其中该示例使用身份列,就像我的第一个示例一样。
这个话题似乎被撕成了两半,但我的直觉告诉我,我应该只使用复合键。
什么对查询更有效?似乎有一个 PK 标识列以及在两列上设置唯一约束,并且 FK 关系的成本会更高,即使是一点点。
【问题讨论】:
-
一位编辑提出的奇怪案例是一本书,由不同作者提交的章节组成,每章可能有几个。正如 Joel Coehoorn 指出的那样,可能还有另一个实体需要跟踪:章节。
-
@HABO 对,很好。到目前为止,每个答案似乎都是正确的,但在我的示例中,永远不会有另一列。
标签: sql-server tsql compound-key