【发布时间】:2020-04-04 17:33:04
【问题描述】:
在 DBMS 中我们有
- Superkey - 一个属性或一组属性,用于唯一标识表中的一行。
- 候选键 - 唯一标识表中行的属性或属性集。超级密钥和候选密钥之间的区别在于,候选密钥的任何子集都不能作为候选密钥。
- 主键 - 选定的候选键,成为唯一标识行的属性。
如果我们想识别两个表之间的多对多关系,我们可以定义一个联结表,例如:
表格:
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 教科书似乎以这种方式定义联结表并以这种方式定义主键,因此那里似乎存在脱节。
我误解了这个概念吗?
【问题讨论】:
-
是的,你误会了。一个表可能有几个候选键——这就是它们是“候选”的原因。 (如您所说,每个属性都可能包含多个属性。)主键是候选者之一,通常出于某些实用/人体工程学的原因而选择为主键。您的联结表是所有关键(就像联结表通常一样),所以只有一个候选者,所以它必须是主要的。
-
请查看我如何将“both”替换为“together”和“and”替换为“plus”,以便清楚并与“composite PK”保持一致。使用“both”和“and”并不清楚您是在谈论 2 个属性,每个属性都是一个 PK 与 2 个属性形成一个 PK。
-
您的参考资料是什么?遵循(好的)出版的关于信息建模、关系模型和数据库设计和查询的学术教科书。 (记录和使用设计的语言和工具手册不是这样的教科书。)(维基文章或网络帖子也不是。)数十种已出版的学术信息建模和数据库设计教科书以 pdf 格式在线免费提供。
标签: database relational-database primary-key rdbms candidate-key