3.6.5 范式判断-02
本课核心知识点整理
3NF:消除传递依赖
3NF 建立在 2NF 基础上,要求非主属性不能传递依赖于候选键。典型结构是:
其中 K 是候选键,A 和 B 都是非主属性,则 B 通过 A 传递依赖于 K。
例如:
函数依赖为:
候选键是 学号。因为候选键是单属性,所以不存在部分依赖,至少满足 2NF;但 系名、系位置 通过非主属性 系号 传递依赖于 学号,所以不满足 3NF。
传递依赖造成什么问题
学生表中每个学生都会重复存储所属系的系名和位置。一旦“计算机系”更名或搬迁,要修改所有该系学生记录;如果新建一个系但还没有学生,无法插入系信息;删除最后一个该系学生,也可能丢失系信息。
改进方式仍然是“哪里不满足就拆哪里”:
拆分时要把 系号 保留在学生关系中,因为它既是学生所属系的外键,也是连接回系信息的桥。
BCNF:每个决定因素都足够强
BCNF 比 3NF 更严格。它要求每个非平凡函数依赖的决定因素都包含某个候选键。常见教材会写成“每个决定因素都是候选键”,软考讲法中常强调“决定因素包含候选码”。
设关系:
含义是学生 S、教师 T、课程 J。业务规则:
- 一个教师只教一门课,所以
。 - 学生选定课程后对应一个教师,所以
。
候选键有两个:
因为 S,J,T 都出现在某个候选键中,所以没有非主属性,至少满足 3NF。但是检查 BCNF:
| 函数依赖 | 决定因素 | 是否包含候选键 | 结论 |
|---|---|---|---|
| T | 不包含 SJ 或 ST | 破坏 BCNF | |
| SJ | 本身就是候选键 | 满足 BCNF 要求 |
只要有一个非平凡依赖的决定因素不满足要求,就不属于 BCNF。因此该模式最高到 3NF。
快速判断表
| 范式 | 必须先满足 | 继续检查什么 | 不满足时最高到 |
|---|---|---|---|
| 1NF | 无 | 属性是否原子 | 未达到 1NF |
| 2NF | 1NF | 非主属性是否部分依赖候选键 | 1NF |
| 3NF | 2NF | 非主属性是否传递依赖候选键 | 2NF |
| BCNF | 3NF | 每个决定因素是否包含候选键 | 3NF |
两个实用捷径:
- 候选键是单属性时,不会因部分依赖破坏 2NF。
- 没有非主属性时,至少满足 3NF,但仍可能不满足 BCNF。
做题路线
- 求候选键,列出主属性和非主属性。
- 按 1NF、2NF、3NF、BCNF 顺序判断,不能跳级。
- 3NF 重点看“候选键 -> 非主属性 -> 非主属性”的链。
- BCNF 不再只盯非主属性,而要逐条看函数依赖左部是否足够成为候选键级别的决定因素。
例题
BCNF 的核心要求是:
非主属性传递依赖于候选键,会破坏:
自查要点
- 3NF 主要排除哪类依赖?
- BCNF 为什么比 3NF 更严格?
- “决定因素不是候选键”会影响哪个范式?