3.6.3 规范化理论基本概念-02
本课核心知识点整理
候选键为什么是范式题的入口
候选键是能够唯一标识元组且没有冗余的属性集。后面判断 2NF、3NF、BCNF 都要先知道候选键,因为只有知道候选键,才能区分主属性和非主属性,才能判断“非主属性是否部分依赖或传递依赖于候选键”。
| 概念 | 精确定义 | 做题判断 |
|---|---|---|
| 超键 | 能推出关系模式全部属性的属性集 | 闭包包含全属性 |
| 候选键 | 最小超键 | 是超键,且去掉任一属性后不再是超键 |
| 主键 | 从候选键中选定的一个 | 业务或实现选择 |
| 主属性 | 出现在任一候选键中的属性 | 所有候选键取并集 |
| 非主属性 | 不出现在任何候选键中的属性 | 范式异常检查重点 |
候选键可以有一个,也可以有多个;可以是单属性,也可以是多属性组合。主属性不是“主键里的属性”,而是“任一候选键里的属性”。
属性闭包法
属性闭包是从某个属性集出发,根据函数依赖能推出的全部属性,记作 X 是否为超键,就看:
其中 U 是关系模式的全部属性集。
计算步骤:
- 初始令
。 - 扫描函数依赖集,若某条依赖
的左部 ,则把 加入 。 - 重复扫描,直到闭包不再增长。
- 若闭包包含全部属性,
X是超键;再检查是否最小,判断候选键。
图示法:从入度为 0 的属性开始
字幕中给了更适合选择题的图示法:把函数依赖画成有向图,A -> B 就画成 A 指向 B。入度为 0 的属性没有任何其他属性能推出,因此必须进入候选键,否则候选键永远推不出它。
mermaid
flowchart LR
A1["A1"] --> A2["A2"]
A3["A3"] --> A2
A2 --> A3
A2 --> A4["A4"]例如依赖为:
A1 入度为 0,必须作为候选键的一部分。从 A1 出发可推出 A2,再由 A2 推出 A3 和 A4,所以:
因此 A1 就是候选键。若再加上其他属性,就会变成有冗余的超键,不是候选键。
入度法的边界
图示法很快,但要理解它的边界:
| 情况 | 处理 |
|---|---|
| 入度为 0 的属性能遍历全部属性 | 这些属性集通常就是候选键 |
| 入度为 0 的属性不能遍历全部属性 | 尝试加入既有入度又有出度的中间属性 |
| 多个中间属性可选 | 分别计算闭包,找最小组合 |
| 存在复合左部依赖 | 图示法要谨慎,闭包法更稳 |
所以正式书写时推荐用闭包法验证,图示法用于快速筛选候选属性。
外键与参照完整性
字幕中顺带复习了外键。外键通常是本关系中的属性,用来引用另一个关系的主键或候选键,体现参照完整性。例如:
学生表中的 专业号 是外键,它要求每个学生所属专业应在专业表中存在。外键表达的是关系模式之间的联系,不负责唯一标识本关系中的元组。
做题路线
- 先找不出现在任何依赖右部的属性,它们通常必须包含在候选键中。
- 对候选属性集求闭包,闭包能覆盖全部属性就是超键。
- 若闭包不够,尝试加入中间属性;若闭包足够,尝试删除属性验证最小性。
- 列出所有候选键后,再判断主属性和非主属性。
- 后续范式题不要跳过这一步,否则部分依赖和传递依赖都容易误判。
例题
不含多余属性、能够唯一标识元组的属性集称为:
判断某属性集能否推出全部属性,常用:
自查要点
- 超键和候选键有什么区别?
- 属性闭包怎么用于求候选键?
- 主属性和非主属性如何判断?