DBMS - 超键和候选键
数据库中的键用于唯一标识记录并维护数据完整性。请阅读本章以深入了解超键和候选键及其工作原理。
DBMS 中键的快速回顾
数据库中的键是一个属性或一组属性,用于唯一标识表中的每条记录。例如,想象一个具有以下列的表 −
- CID (College ID)
- UID (University ID)
- Name
- Marks
这里,每行代表一名学生。我们使用键来唯一标识特定学生的记录。没有键,我们可能会遇到检索重复记录或无法精确定位特定条目等问题。
超键:键的超集
顾名思义,超键是键的超集。超键是表中任何一组属性组合,能够唯一标识一条记录。即使组合中包含不必要的属性也没关系,只要该组能够唯一标识一行,它就是超键。
以下是超键的重要特性 −
- 它可以包含一个或多个属性。
- 属性组可能包含不必要的属性。
- 每种组合都必须确保唯一标识。
例如,在我们的Student表中,CID、UID和Name都可以单独作为超键,因为它们能够标识记录。像(CID + UID)、(UID + Marks)甚至(CID + UID + Name)这样的组合也是超键,因为它们仍然能够唯一标识行。
超键的数量
表中超键的总数取决于属性。对于我们示例中具有四个属性的表,可能存在多个超键。这些超键可以包括所有四个属性、三属性的子集、二属性的子集,甚至单个属性。它们都用于唯一标识行。
超键的重要性
超键很重要,因为它们构成了标识记录的基础。然而,并非所有超键都实用或可用。许多超键包含冗余属性,它们不会为标识过程增加价值。这就引出了下一类键,即候选键。
候选键:最小超键
候选键是超键的最小子集。简单来说,它是能够唯一标识行的最小属性组。如果从候选键中移除任何一个属性,它就无法再作为唯一标识符。
以下是候选键的重要特性 −
- 它是超键,但不包含冗余属性。
- 每个表可以有一个或多个候选键。
- 候选键是成为Primary Key的潜在候选。
候选键示例
让我们再次查看Student表。我们有多个超键 −
- CID
- UID
- CID + UID
- UID + Name
其中,CID和UID是候选键,因为 −
- 它们能够唯一标识行。
- 它们不包含任何不必要的属性。
另一方面,像(CID + UID)这样的组合不是候选键,因为额外的属性不会为标识过程增加任何价值。
为什么使用“候选”一词?
使用“candidate”(候选)一词是为了表示这些键是“候选”成为表的主键。
如何决定候选键(Candidate Key)?
要确定候选键(Candidate Keys),我们必须按照以下步骤进行 −
- 列出所有超键(Super Keys) − 首先识别所有能够唯一标识行的属性组合。
- 消除冗余 − 移除包含不必要属性的组合。
- 验证最小性 − 确保每个候选键都是最小性的,即移除任何一个属性都会使其失效。
示例 − 在我们的 Student 表中,CID 和 UID 是能够唯一标识行的独立属性。这些是候选键(Candidate Keys)。现在,像 (CID + UID) 或 (UID + Marks) 这样的组合是超键(Super Keys),但不是候选键,因为它们包含了不必要的属性。
候选键(Candidate Keys)和主键(Primary Keys)
一旦我们识别出候选键,就需要选择其中一个作为主键(Primary Key)。这个决定通常基于键的作用域和实用性。
如何选择主键(Primary Key)?
假设在我们的 Student 表中,CID 和 UID 都是候选键。那么,问题来了,应该选择哪一个作为主键?这取决于上下文 −
- CID 仅限于单个学院。它只能在单一机构内唯一标识学生。
- UID 却是通用的。它可以跨多个学院标识学生。
鉴于此,UID 是主键的更好选择,因为它的作用域更广、更具意义。
示例 − 超键(Super Key)就像一份购物清单,包含了你可能需要的一切物品。有些物品是必需的,而有些是多余的。候选键(Candidate Key)则是精简后的清单;它只包含我们绝对需要完成任务的必需物品。主键(Primary Key)是我们决定最先购买的最关键物品。
超键(Super Keys)和候选键(Candidate Keys)的区别
总结一下,以下是超键(Super Keys)和候选键(Candidate Keys)的快速比较 −
| 特征 | Super Key | Candidate Key |
|---|---|---|
| 定义 | 任何能够唯一标识行的属性或属性集 | 超键的最小子集 |
| 冗余 | 可能包含不必要的属性 | 没有不必要的属性 |
| 数量 | 通常较多 | 少于超键的数量 |
| 示例 | CID + UID, UID + Name | CID, UID |
结论
在本章中,我们详细解释了数据库中超键(Super Keys)和候选键(Candidate Keys)的概念。从键对于唯一标识行的重要性简要回顾开始,我们涵盖了超键,学习了它们如何包含任何属性组合,甚至是冗余的。
在超键之后,我们转向候选键,它们是超键的最小且实用的子集。我们还涵盖了如何识别候选键,将它们与超键进行比较,并说明了如何使用候选键来决定表的的主键。