欢迎光临
我们一直在努力

【数据库技术】多值依赖与第四范式(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 的值,且这组值与 RRRZZZ 的值无关(其中 Z=R−X−YZ = R – X – YZ=RXY)。

符号:X↠YX \\twoheadrightarrow YXY(读作“X 多值决定 Y”)

形式化定义:对于关系 RRR 中的任意两个元组 t1t_1t1t2t_2t2,如果 t1[X]=t2[X]t_1[X] = t_2[X]t1[X]=t2[X],则存在元组 t3t_3t3t4t_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 属性的取值。XXXYYY 的“配对”关系与 ZZZ 无关。

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

对比项函数依赖 X→YX \\rightarrow YXY多值依赖 X↠YX \\twoheadrightarrow YXY
决定关系 XXX 的每个值唯一确定 YYY 的一个值 XXX 的每个值对应 YYY 的一组值(可能是多个)
数量关系 一对一(一个X值 → 一个Y值) 一对多(一个X值 → 多个Y值)
独立性 不涉及“与Z无关” YYY 的值与 ZZZ 的值相互独立
异常表现 数据冗余 数据冗余(更隐蔽)

在上面的例子中:

  • 教师 →\\rightarrow 课程?不成立(一个教师教多门课)
  • 教师 ↠\\twoheadrightarrow 课程?成立(一个教师对应一组课程)
  • 教师 ↠\\twoheadrightarrow 教材?成立(一个教师对应一组教材)
  • 课程 ↠\\twoheadrightarrow 教材?可能成立(如果各课程教材独立,则成立)

2.4 平凡多值依赖 vs 非平凡多值依赖

类型定义示例
平凡多值依赖 Y⊆XY \\subseteq XYXX∪Y=RX \\cup Y = RXY=R(所有属性都在X或Y中) (教师,课程)↠教师(教师, 课程) \\twoheadrightarrow 教师(教师,课程)教师(Y是X的子集)
非平凡多值依赖 Y⊈XY \\not\\subseteq XYXX∪Y≠RX \\cup Y \\neq RXY=R 教师↠课程教师 \\twoheadrightarrow 课程教师课程(有Z属性存在)

软考重点:4NF要消除的是非平凡多值依赖。平凡多值依赖是“必然成立”的,没有实际意义。

3️⃣ 第四范式(4NF,Fourth Normal Form)

3.1 定义

第四范式(4NF) 在BCNF的基础上,要求:

消除所有非平凡多值依赖。即,如果关系 RRR 中存在非平凡多值依赖 X↠YX \\twoheadrightarrow YXY,则 XXX 必须包含候选键。

3.2 判断步骤

步骤操作
第1步 确认该关系满足BCNF
第2步 找出所有的多值依赖(MVD),特别关注非平凡MVD
第3步 检查每个非平凡MVD X↠YX \\twoheadrightarrow YXY 的左部 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 = RXY=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 BAB,且没有其他依赖。候选键为 (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 BAB,且 AAA 不包含候选键(候选键是全部三个属性)❌
    • 不满足4NF

    选 A。


    例题2:以下关于多值依赖的叙述中,正确的是( )。

    A. 多值依赖是函数依赖的特例
    B. 如果 X→YX \\rightarrow YXY 成立,则 X↠YX \\twoheadrightarrow YXY 一定成立
    C. 如果 X↠YX \\twoheadrightarrow YXY 成立,则 X→YX \\rightarrow YXY 一定成立
    D. 多值依赖与函数依赖没有任何关系

    解析:

    • A错误:函数依赖是多值依赖的特例(一对一 vs 一对多)
    • B正确:X→YX \\rightarrow YXY 表示一个X值对应一个Y值,这当然也属于“一组值”的情况(这一组只有一个值),所以 X↠YX \\twoheadrightarrow YXY 一定成立
    • C错误:反过来不成立(一个X值对应多个Y值时,不满足函数依赖)
    • D错误:两者有关系(函数依赖是MVD的特例)

    选 B。

    6️⃣ 记忆口诀

    函数依赖一对一,多值依赖一对多。
    X→YX \\rightarrow YXY 必推出 X↠YX \\twoheadrightarrow YXY,反过来未必行得通。
    4NF消除多值依赖,把独立集合拆出来。

    7️⃣ 小测验(评论区对答案)

    关系模式 R(A,B,C)R(A, B, C)R(A,B,C),已知 A↠BA \\twoheadrightarrow BABA↠CA \\twoheadrightarrow CAC,候选键为 (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)

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

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

    赞(0)
    未经允许不得转载:171主机测评 » 【数据库技术】多值依赖与第四范式(4NF)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址