主键如何在 DBMS 的联结表中工作?组合键如何成为主键?

How do primary keys work in junction tables for a DBMS? How can a composite key be a primary key?

在 DBMS 中我们有

  1. 超级键 - 在 table.
  2. 中唯一标识一行的一个属性或一组属性
  3. 候选键 - 一个属性或一组属性,用于唯一标识 table 中的一行。超级键和候选键之间的区别是候选键的子集本身不能是候选键。
  4. 主键 - 一个选定的候选键,成为唯一标识一行的属性。

如果我们想识别两个 table 之间的多对多关系,我们可以定义一个连接 table 例如:

表:

Author(AuthorID, FirstName, LastName) -- AuthorID is primary key
Book(BookID, BookTitle) -- BookID is primary key

创建两者之间的关系:

AuthorBook(authorID, BookID) -- together authorID and BookID are primary key

我认为 bookID 和 authorID 就其本身而言都是主键。

既然候选键(以及主键)不能有包含候选键的子集,authorID 加上 BookID 怎么会是主键呢?这似乎打破了主键的定义。

我知道这可能是现实世界与理论之间的区别,但正如我读过的 DBMS 教科书似乎以这种方式定义联结 tables 并以这种方式定义主键,似乎存在断开连接那里。

我是不是误解了这个概念?

当我们使用其中一个术语时,我们必须谈论给定的 table(变量、值或表达式)。 table 的超级密钥、CK 和 PK 不是由其属性在其他 table 中扮演的角色决定的。它们取决于在给定业务规则下 table 可以产生哪些有效值。

Superkey - An attribute or a set of attributes that uniquely identifies a row in a database.

给定 table 的超级键可以定义为 table 的 "uniquely identifies a row" 的一组属性。(不是数据库.) 虽然引用的短语是一种 shorthand 如果您还不知道它的意思,那不是一个很清楚的描述。

给定 table 的超级键可以定义为一组属性,其子行值只能在 table 中出现一次。或者作为一组属性,在功能上确定 table.

中的每组属性

当一个超级键只有一个属性时,我们可以草率地谈论那个属性是一个超级键。

Candidate Key - An attribute or set of attributes that uniquely identifies a row in a database.

的确,某个 table 的每个 CK(候选密钥)都是那个 table 的超级密钥。但是你的意思是一组属性根据定义是一个超级键 when/iff 和其他一些条件。但是你写这一段的时候并没有说清楚

The difference between the superkey and a candidate key is no subset of a candidate key can itself be a candidate key.

没有。集合是其自身的子集,因此 CK 是其自身的子集,因此 CK 始终具有作为 CK 自身的子集。你的意思是,没有 proper/smaller 子集。那么你的说法是正确的。但同样真实且更重要的是,CK 的 proper/smaller 个子集都不是超级密钥。

您实际上并未在本段中定义 "CK"。 给定 table 的 CK 可以定义为 table 的超键,它不包含 proper/smaller 子集,该子集是 table 的超键。

Primary key - A chosen candidate key that becomes the attribute to uniquely identify a row.

没有。 给定 table 的 PK(主键)定义为您决定调用 PK 的那个 table 的一个 CK。(不是属性。)

请注意,CK 和 PK 是超级密钥。 PK 与关系理论无关。

To create the relation between both:

AuthorBook(authorID, BookID) -- together authorID and BookID are primary key

超级密钥和 CK 是什么以及 PK 可以是什么由 table 中保存的 FD(功能依赖项)决定。但是,如果您假设这是多对多 table,则需要一对 authorID-bookID 来唯一标识一行,因此只能有一个 CK,{authorID, bookID}。所以那是唯一可能的PK。所以 {authorID} 和 {bookID} 不能是超级密钥或 CK 或 PK。

您可以通过查看示例和应用定义来了解这一点。

authorID bookID
      1      a
      1      b

这里的authorID并不能唯一标识一行。所以它不可能是超级钥匙。所以它不可能是CK。所以不能PK。

textbooks I have read seem to define junction tables this way and define primary keys this way

不,他们没有。

但是他们确实说某些属性集和超级密钥的子集,联结 table 中的 CK 和 PK 是联结 table 中引用其他 [=81] 的 FK(外键) =]s 其中它们是 CK(可能是 PK)of/in 其他 tables.

给定 table 的 FK 可以定义为 table 中的一组特定属性,其子行值必须作为某些其他 table.

但是既然你说这是一个联结点 table,大概 {authorID} 是作者 table 的 FK,它的值出现在 CK/PK 下 & {bookID} 是对一本书 table 的 FK,其值出现在 CK/PK 下。因此,AuthorBook 中的 FK {authorID} 引用了 Author 中的 {authorID},FK {bookID} 中的 AuthorBook 引用了 Book 中的 {bookID}。

PS PK & other terms mean something else in SQL. 声明的 SQL PK 可以在其中声明更小的 SQL UNIQUE。 SQL "uniqueness" 本身是根据 SQL NULL 定义的。可以合理地说 SQL PK 比关系 PK 更让人联想到关系超级密钥。类似地,SQL FK 更让人联想到我们可以合理地称之为关系外超级键而不是关系外键。