【数据库技术】多值依赖与第四范式(4NF)

考点频率 :★★★☆☆(选择题偶尔出现,是理解更高范式的进阶内容)

难度 :⭐⭐⭐⭐⭐

建议:重点理解多值依赖与函数依赖的本质区别,掌握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,如果 t1X=t2Xt_1X = t_2Xt1X=t2X,则存在元组 t3t_3t3 和 t4t_4t4,使得 t3X=t1Xt_3X = t_1Xt3X=t1X,t3Y=t1Yt_3Y = t_1Yt3Y=t1Y,t3Z=t2Zt_3Z = t_2Zt3Z=t2Z,且 t4X=t1Xt_4X = t_1Xt4X=t1X,t4Y=t2Yt_4Y = t_2Yt4Y=t2Y,t4Z=t1Zt_4Z = t_1Zt4Z=t1Z

人话版 :对于 XXX 的每个值,YYY 有一组值与之对应,而且这组值独立于 ZZZ 属性的取值。XXX 和 YYY 的"配对"关系与 ZZZ 无关。

2.3 函数依赖 vs 多值依赖(核心区别)

对比项 函数依赖 X→YX \rightarrow YX→Y 多值依赖 X↠YX \twoheadrightarrow YX↠Y
决定关系 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)

教学表(教师, 课程, 教材)

分解为两张表

  1. 教师-课程表(教师, 课程)------ 每位教师教哪些课
  2. 教师-教材表(教师, 教材)------ 每位教师用哪些教材

分解后的多值依赖

  • 教师-课程表:只有 教师↠课程教师 \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)

🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #多值依赖 #第四范式 #数据库规范化 #数据库技术基础 #软考备考

相关推荐
tq10861 小时前
算法的另一面
笔记
子文雨1 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法
青山木1 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法
玛卡巴卡ldf1 小时前
【AICoding】笔试提示词设计思路
java·算法·ai编程
微软技术分享1 小时前
Ubuntu 本地部署Ollama+OpenWebUI教程
数据库·ubuntu·postgresql
明月_清风1 小时前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法
Rnan-prince1 小时前
堆与TopK · 从零到通透 —— 9 节全系列复盘
python·算法
明月_清风1 小时前
Hash 表从入门到精通:Go 实战与工程细节
前端·后端·算法
ly76891 小时前
MySQL 自增主键耗尽:从原理到应急恢复
数据库·mysql·innodb·故障恢复·自增主键·主键设计