考点频率:★★★☆☆(选择题偶尔出现,是理解更高范式的进阶内容)
难度:⭐⭐⭐⭐⭐
建议:重点理解多值依赖与函数依赖的本质区别,掌握4NF的定义与判断方法
1️⃣ 为什么3NF和BCNF还不够?
经过前面几篇文章的学习,我们现在知道了:
| 1NF | 属性不可再分 |
| 2NF | 消除非主属性对候选键的部分依赖 |
| 3NF | 消除非主属性对候选键的传递依赖 |
| BCNF | 消除任何属性(包括主属性)对候选键的传递/部分依赖 |
BCNF似乎已经“完美”了——所有函数依赖的左部都是候选键,所有冗余和异常都应该消除了?
不一定。
因为还有一种数据依赖,是函数依赖无法描述的——多值依赖(Multivalued Dependency,MVD)。
2️⃣ 什么是多值依赖(MVD)?
2.1 先看一个例子
假设有一个表存储“教师-课程-教材”的关系:
教学表(教师, 课程, 教材)
| 张老师 | 数学 | 教材A |
| 张老师 | 数学 | 教材B |
| 张老师 | 物理 | 教材C |
| 张老师 | 物理 | 教材D |
| 李老师 | 数学 | 教材A |
| 李老师 | 数学 | 教材B |
仔细观察这张表,你会发现一个规律:
对于“张老师”这个人,他有固定的课程集合({数学, 物理})和固定的教材集合({教材A, 教材B, 教材C, 教材D})。课程和教材之间没有直接关系——数学课用教材A或教材B都可以,物理课用教材C或教材D都可以。
换句话说:教师的课程选择和教材选择是相互独立的。知道张老师教数学,不能推出他用哪本教材;知道张老师用教材A,也不能推出他教哪门课。
这种独立性,就是多值依赖的来源。
2.2 多值依赖的定义
多值依赖(MVD)是指:在关系 RRR 中,属性集 XXX 的每一个值,都对应着一组 YYY 的值,且这组值与 RRR 中 ZZZ 的值无关(其中 Z=R−X−YZ = R – X – YZ=R−X−Y)。
符号:X↠YX \\twoheadrightarrow YX↠Y(读作“X 多值决定 Y”)
形式化定义:对于关系 RRR 中的任意两个元组 t1t_1t1 和 t2t_2t2,如果 t1[X]=t2[X]t_1[X] = t_2[X]t1[X]=t2[X],则存在元组 t3t_3t3 和 t4t_4t4,使得 t3[X]=t1[X]t_3[X] = t_1[X]t3[X]=t1[X],t3[Y]=t1[Y]t_3[Y] = t_1[Y]t3[Y]=t1[Y],t3[Z]=t2[Z]t_3[Z] = t_2[Z]t3[Z]=t2[Z],且 t4[X]=t1[X]t_4[X] = t_1[X]t4[X]=t1[X],t4[Y]=t2[Y]t_4[Y] = t_2[Y]t4[Y]=t2[Y],t4[Z]=t1[Z]t_4[Z] = t_1[Z]t4[Z]=t1[Z]。
人话版:对于 XXX 的每个值,YYY 有一组值与之对应,而且这组值独立于 ZZZ 属性的取值。XXX 和 YYY 的“配对”关系与 ZZZ 无关。
2.3 函数依赖 vs 多值依赖(核心区别)
| 决定关系 | XXX 的每个值唯一确定 YYY 的一个值 | XXX 的每个值对应 YYY 的一组值(可能是多个) |
| 数量关系 | 一对一(一个X值 → 一个Y值) | 一对多(一个X值 → 多个Y值) |
| 独立性 | 不涉及“与Z无关” | YYY 的值与 ZZZ 的值相互独立 |
| 异常表现 | 数据冗余 | 数据冗余(更隐蔽) |
在上面的例子中:
- 教师 →\\rightarrow→ 课程?不成立(一个教师教多门课)
- 教师 ↠\\twoheadrightarrow↠ 课程?成立(一个教师对应一组课程)
- 教师 ↠\\twoheadrightarrow↠ 教材?成立(一个教师对应一组教材)
- 课程 ↠\\twoheadrightarrow↠ 教材?可能成立(如果各课程教材独立,则成立)
2.4 平凡多值依赖 vs 非平凡多值依赖
| 平凡多值依赖 | Y⊆XY \\subseteq XY⊆X 或 X∪Y=RX \\cup Y = RX∪Y=R(所有属性都在X或Y中) | (教师,课程)↠教师(教师, 课程) \\twoheadrightarrow 教师(教师,课程)↠教师(Y是X的子集) |
| 非平凡多值依赖 | Y⊈XY \\not\\subseteq XY⊆X 且 X∪Y≠RX \\cup Y \\neq RX∪Y=R | 教师↠课程教师 \\twoheadrightarrow 课程教师↠课程(有Z属性存在) |
软考重点:4NF要消除的是非平凡多值依赖。平凡多值依赖是“必然成立”的,没有实际意义。
3️⃣ 第四范式(4NF,Fourth Normal Form)
3.1 定义
第四范式(4NF) 在BCNF的基础上,要求:
消除所有非平凡多值依赖。即,如果关系 RRR 中存在非平凡多值依赖 X↠YX \\twoheadrightarrow YX↠Y,则 XXX 必须包含候选键。
3.2 判断步骤
| 第1步 | 确认该关系满足BCNF |
| 第2步 | 找出所有的多值依赖(MVD),特别关注非平凡MVD |
| 第3步 | 检查每个非平凡MVD X↠YX \\twoheadrightarrow YX↠Y 的左部 XXX 是否包含候选键 |
| 第4步 | 如果所有非平凡MVD的左部都包含候选键,则满足4NF;否则不满足 |
3.3 典型反例(教学表)
关系模式:教学表(教师, 课程, 教材)
候选键:(教师, 课程, 教材)——全键(所有属性一起才能唯一标识一行)
多值依赖:
- 教师↠课程教师 \\twoheadrightarrow 课程教师↠课程(一个教师对应多门课程,且与教材无关)
- 教师↠教材教师 \\twoheadrightarrow 教材教师↠教材(一个教师对应多本教材,且与课程无关)
检查:
- 教师↠课程教师 \\twoheadrightarrow 课程教师↠课程 的左部是“教师”,它不包含候选键(候选键是所有三个属性的组合)❌
- 教师↠教材教师 \\twoheadrightarrow 教材教师↠教材 的左部是“教师”,它不包含候选键 ❌
结论:该关系满足BCNF(因为候选键是全键,没有任何非平凡函数依赖),但不满足4NF。
3.4 如何从BCNF提升到4NF?(模式分解)
将违反4NF的表拆分成多张表,消除非平凡多值依赖:
原表(不满足4NF):
教学表(教师, 课程, 教材)
分解为两张表:
分解后的多值依赖:
- 教师-课程表:只有 教师↠课程教师 \\twoheadrightarrow 课程教师↠课程,但这是平凡MVD(X∪Y=RX \\cup Y = RX∪Y=R,没有Z属性)
- 教师-教材表:同理,是平凡MVD
- 平凡MVD不违反4NF ✅
4️⃣ 范式递进关系完整版
| 1NF | 属性不可再分(原子性) | 多值属性 |
| 2NF | 1NF + 非主属性完全依赖于候选键 | 非主属性的部分函数依赖 |
| 3NF | 2NF + 非主属性直接依赖于候选键 | 非主属性的传递函数依赖 |
| BCNF | 3NF + 所有函数依赖的左部都包含候选键 | 主属性的传递/部分函数依赖 |
| 4NF | BCNF + 消除非平凡多值依赖 | 多值依赖(属性的独立性) |
5️⃣ 经典例题
例题1:关系模式 R(A,B,C)R(A, B, C)R(A,B,C),存在多值依赖 A↠BA \\twoheadrightarrow BA↠B,且没有其他依赖。候选键为 (A,B,C)(A, B, C)(A,B,C)(全键)。则 RRR 的范式等级为( )。
A. BCNF但不满足4NF
B. 4NF
C. 3NF但不满足BCNF
D. 2NF
解析:
- 候选键是全键 (A,B,C)(A, B, C)(A,B,C),没有非平凡函数依赖(因为候选键决定了所有属性,这是平凡的)
- 满足BCNF ✅
- 存在非平凡MVD A↠BA \\twoheadrightarrow BA↠B,且 AAA 不包含候选键(候选键是全部三个属性)❌
- 不满足4NF
选 A。
例题2:以下关于多值依赖的叙述中,正确的是( )。
A. 多值依赖是函数依赖的特例
B. 如果 X→YX \\rightarrow YX→Y 成立,则 X↠YX \\twoheadrightarrow YX↠Y 一定成立
C. 如果 X↠YX \\twoheadrightarrow YX↠Y 成立,则 X→YX \\rightarrow YX→Y 一定成立
D. 多值依赖与函数依赖没有任何关系
解析:
- A错误:函数依赖是多值依赖的特例(一对一 vs 一对多)
- B正确:X→YX \\rightarrow YX→Y 表示一个X值对应一个Y值,这当然也属于“一组值”的情况(这一组只有一个值),所以 X↠YX \\twoheadrightarrow YX↠Y 一定成立
- C错误:反过来不成立(一个X值对应多个Y值时,不满足函数依赖)
- D错误:两者有关系(函数依赖是MVD的特例)
选 B。
6️⃣ 记忆口诀
函数依赖一对一,多值依赖一对多。
X→YX \\rightarrow YX→Y 必推出 X↠YX \\twoheadrightarrow YX↠Y,反过来未必行得通。
4NF消除多值依赖,把独立集合拆出来。
7️⃣ 小测验(评论区对答案)
关系模式 R(A,B,C)R(A, B, C)R(A,B,C),已知 A↠BA \\twoheadrightarrow BA↠B,A↠CA \\twoheadrightarrow CA↠C,候选键为 (A,B,C)(A, B, C)(A,B,C)。为使 RRR 满足4NF,应分解为( )。
A. (A,B)(A, B)(A,B) 和 (A,C)(A, C)(A,C)
B. (A,B)(A, B)(A,B) 和 (B,C)(B, C)(B,C)
C. (A,B,C)(A, B, C)(A,B,C) 不分解
D. (A)(A)(A) 和 (B,C)(B, C)(B,C)
🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #多值依赖 #第四范式 #数据库规范化 #数据库技术基础 #软考备考




