3.6.4 范式判断-01
本课核心知识点整理
范式判断要层层推进
范式不是并列概念,而是逐层提高的规范化程度。只有满足 1NF,才讨论 2NF;只有满足 2NF,才讨论 3NF;满足 3NF 后,才进一步看 BCNF。
mermaid
flowchart LR
A["属性原子"] --> B["1NF"]
B --> C["消除非主属性对候选键的部分依赖"]
C --> D["2NF"]
D --> E["消除非主属性对候选键的传递依赖"]
E --> F["3NF"]
F --> G["每个决定因素都包含候选键"]
G --> H["BCNF"]本节先看 1NF 和 2NF。核心问题是:属性是不是原子的,非主属性是不是完整依赖于整个候选键。
1NF:属性值不可再分
1NF 要求每个属性值都是不可再分的原子值。比如“联系电话”字段里同时塞入“手机号、座机、紧急联系人电话”,在需要分别检索和维护时就不够原子。
| 情况 | 是否满足 1NF | 说明 |
|---|---|---|
姓名=张三 | 通常满足 | 题干未要求拆姓和名 |
地址=省/市/区/详细地址 | 取决于题干 | 若需要分别查询省市区,应拆分 |
课程列表=C01,C02,C03 | 不满足 | 一个单元格存多个课程值 |
电话1, 电话2, 电话3 | 形式上原子但设计差 | 有重复组,应考虑独立联系方式表 |
考试通常默认给出的属性已不可再分,除非题干明确出现多值、重复组或复合字段。
2NF:非主属性必须完全依赖候选键
2NF 建立在 1NF 基础上,要求所有非主属性都完全函数依赖于候选键。它主要解决组合候选键下的部分依赖。
设:
如果函数依赖为:
候选键是 {学号, 课程号}。成绩 依赖整个组合键,因为只有知道某学生和某课程,才能确定成绩;但 学分 只依赖组合键的一部分 课程号,这就是非主属性对候选键的部分函数依赖,因此该关系只达到 1NF,不满足 2NF。
为什么部分依赖会造成冗余
如果一个课程有很多学生选,学分会在多条选课记录中重复。课程学分变化时要改多行;如果没有学生选某课程,就无法仅保存课程学分;删除最后一条选课记录还可能丢失课程学分信息。
分解思路是“哪里不满足就拆哪里”:
注意 课程号 不能从选课关系中完全拿走,因为剩余关系还需要用 {学号, 课程号} 决定成绩,也需要与课程关系连接还原。
2NF 快速判断
| 情况 | 快速结论 | 原因 |
|---|---|---|
| 候选键只有单属性 | 至少不会因部分依赖破坏 2NF | 单属性没有可再拆的真子集 |
| 没有非主属性 | 至少满足 2NF | 没有非主属性可发生部分依赖 |
| 候选键是组合属性 | 必须检查部分依赖 | 组合键的一部分可能决定非主属性 |
| 非主属性由整个候选键决定 | 对 2NF 友好 | 属于完全函数依赖 |
“至少”二字很重要。单属性候选键可以避免部分依赖,但还可能存在传递依赖,所以不一定满足 3NF。
做题路线
- 默认先判断 1NF:属性是否原子。
- 求候选键,标出主属性和非主属性。
- 如果候选键是组合属性,逐个检查非主属性是否被组合键的一部分决定。
- 一旦发现部分依赖,最高只能判到 1NF;若题目要求改进,就把造成部分依赖的属性拆成独立关系。
例题
1NF 的基本要求是:
判断 2NF 时重点检查:
自查要点
- 1NF 判断的关键是什么?
- 为什么 2NF 要先求候选键?
- 部分函数依赖通常在什么情况下出现?