3 关系数据库规范化
本文最后更新于:2025年10月23日 上午
一、数据依赖核心概念
数据依赖是关系模式中属性间的关联,共3种,核心为函数依赖(FD),此外还有多值依赖(MVD)和连接依赖(JD)。
1. 函数依赖定义
- 若关系模式R中,属性/属性组X的每个具体值,都对应属性Y的唯一具体值,则称Y函数依赖于X,记为
X→Y。 - 本质:X的值可唯一确定Y的值,例如“学号→姓名”(一个学号对应唯一姓名)。
2. 3种特定函数依赖
| 类型 | 定义 | 示例 |
|---|---|---|
| 平凡/非平凡依赖 | 若X→Y且Y⊆X,为平凡依赖;若Y⊄X,为非平凡依赖 |
在“学生号,课程号,成绩”中: - (学生号,课程号)→成绩(非平凡,成绩不在X中)- (学生号,课程号)→课程号(平凡,课程号在X中) |
| 完全/部分依赖 | 若X→Y,且X的任一真子集Z都不能推出Y,为完全依赖;若存在Z⊂X能推出Y,为部分依赖 |
在“学号,课程号,姓名,成绩”中: - (学号,课程号)→成绩(完全,单独学号/课程号推不出成绩)- (学号,课程号)→姓名(部分,学号 alone 可推出姓名) |
| 传递依赖 | 若X→Y且Y→Z(Y不依赖于Z,Z⊄Y),则X→Z为传递依赖 |
在“学号,系名,系主任”中: - 学号→系名,系名→系主任,故学号→系主任(传递依赖) |
3. 码的函数依赖定义
- 候选码:属性/属性组K,若
K→U(U为关系所有属性),则K为候选码;选定一个候选码作为主码。
二、关系规范化的目的
1. 问题根源
关系模式中不合适的数据依赖会导致4类异常,以“学生信息表(学号,姓名,系别,系主任,课程号,成绩)”为例:
| 异常类型 | 表现 | 示例 |
|---|---|---|
| 数据冗余 | 重复存储无关数据 | 系主任姓名随该系每个学生重复出现 |
| 更新异常 | 修改需同步多处,易出错 | 更换系主任时,需修改该系所有学生的记录 |
| 插入异常 | 必要数据无法插入 | 新系无学生时,系和系主任信息无法存入 |
| 删除异常 | 删除目标数据时误删关联数据 | 删除某系所有学生记录时,系和系主任信息也被删 |
2. 规范化目标
通过分解关系模式,消除不合适的数据依赖,解决上述4类异常,提升数据完整性和存储效率。
三、范式与规范化过程
范式(Normal Form)是衡量关系模式规范化程度的标准,满足最低要求的是1NF,逐级提升至5NF,关系为1NF⊃2NF⊃3NF⊃BCNF⊃4NF⊃5NF,实际应用中规范化到3NF即可。
1. 各范式定义与判定
| 范式 | 定义 | 关键要求 | 示例(不满足→满足的分解) |
|---|---|---|---|
| 1NF(最低) | 关系中每个属性的值域为“不可分的原子数据” | 属性不可再分 | 原“职工表”含“工资”(分基本工资/工龄工资)→ 分解为“职工号,姓名,基本工资,工龄工资” |
| 2NF | 在1NF基础上,非主属性完全函数依赖于主码(无部分依赖) | 消除非主属性对主码的部分依赖 | 原“学生(学号,姓名,课程,学分)”(学号→姓名,部分依赖)→ 分解为:- S1(学号,姓名) - S2(学号,课程,学分) |
| 3NF | 在2NF基础上,非主属性不传递依赖于主码 | 消除非主属性对主码的传递依赖 | 原“学生(学号,姓名,系名,系主任)”(学号→系主任,传递依赖)→ 分解为:- 学生(学号,姓名,系名) - 系(系名,系主任) |
2. 规范化核心步骤(以1NF→3NF为例)
以“学生(学号,姓名,系名,系主任,课程号,课程名,成绩)”为例:
- 判定1NF:所有属性不可再分,满足1NF;
- 分解为2NF:消除非主属性对主码(学号+课程号)的部分依赖,分解为3个关系:
- 学生(学号,姓名,系名,系主任)
- 课程(课程号,课程名)
- 成绩(学号,课程号,成绩)
- 分解为3NF:消除学生表中“系主任”对“学号”的传递依赖,再分解为:
- 学生(学号,姓名,系名)
- 系(系名,系主任)
- 最终3NF关系:学生、系、课程、成绩(共4个表)。
3. 规范化的优缺点
| 维度 | 说明 |
|---|---|
| 优点 | 减少数据冗余,避免插入/删除/更新异常,保持数据一致性 |
| 缺点 | 数据分散在多表中,查询时需多表连接,增加操作复杂度,降低效率 |
四、核心要点总结
- 关键概念:需掌握函数依赖(平凡/非平凡、完全/部分、传递)、候选码、1NF/2NF/3NF的定义;
- 核心目标:通过分解关系模式,消除不合适的数据依赖,解决数据冗余与操作异常;
- 实操重点:规范化到3NF的步骤——先消除部分依赖(1NF→2NF),再消除传递依赖(2NF→3NF)。
3 关系数据库规范化
https://hellowydwyd.github.io/2025/10/23/3-关系数据库规范化/