3 关系数据库规范化

本文最后更新于:2025年10月23日 上午

一、数据依赖核心概念

数据依赖是关系模式中属性间的关联,共3种,核心为函数依赖(FD),此外还有多值依赖(MVD)和连接依赖(JD)。

1. 函数依赖定义

  • 若关系模式R中,属性/属性组X的每个具体值,都对应属性Y的唯一具体值,则称Y函数依赖于X,记为X→Y
  • 本质:X的值可唯一确定Y的值,例如“学号→姓名”(一个学号对应唯一姓名)。

2. 3种特定函数依赖

类型 定义 示例
平凡/非平凡依赖 X→YY⊆X,为平凡依赖;若Y⊄X,为非平凡依赖 在“学生号,课程号,成绩”中:
- (学生号,课程号)→成绩(非平凡,成绩不在X中)
- (学生号,课程号)→课程号(平凡,课程号在X中)
完全/部分依赖 X→Y,且X的任一真子集Z都不能推出Y,为完全依赖;若存在Z⊂X能推出Y,为部分依赖 在“学号,课程号,姓名,成绩”中:
- (学号,课程号)→成绩(完全,单独学号/课程号推不出成绩)
- (学号,课程号)→姓名(部分,学号 alone 可推出姓名)
传递依赖 X→YY→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为例)

以“学生(学号,姓名,系名,系主任,课程号,课程名,成绩)”为例:

  1. 判定1NF:所有属性不可再分,满足1NF;
  2. 分解为2NF:消除非主属性对主码(学号+课程号)的部分依赖,分解为3个关系:
    • 学生(学号,姓名,系名,系主任)
    • 课程(课程号,课程名)
    • 成绩(学号,课程号,成绩)
  3. 分解为3NF:消除学生表中“系主任”对“学号”的传递依赖,再分解为:
    • 学生(学号,姓名,系名)
    • 系(系名,系主任)
  4. 最终3NF关系:学生、系、课程、成绩(共4个表)。

3. 规范化的优缺点

维度 说明
优点 减少数据冗余,避免插入/删除/更新异常,保持数据一致性
缺点 数据分散在多表中,查询时需多表连接,增加操作复杂度,降低效率

四、核心要点总结

  1. 关键概念:需掌握函数依赖(平凡/非平凡、完全/部分、传递)、候选码、1NF/2NF/3NF的定义;
  2. 核心目标:通过分解关系模式,消除不合适的数据依赖,解决数据冗余与操作异常;
  3. 实操重点:规范化到3NF的步骤——先消除部分依赖(1NF→2NF),再消除传递依赖(2NF→3NF)。

3 关系数据库规范化
https://hellowydwyd.github.io/2025/10/23/3-关系数据库规范化/
作者
YuDong Wang
发布于
2025年10月23日
许可协议