请使用支持现代 CSS 与 JavaScript 的浏览器播放课件
DBPA · 6.1

函数依赖与规范化

从数据语义识别依赖,减少关系模式异常

VER. 2608.2 Built with impress.js

学习目标

函数依赖把业务语义连接到范式判断,规范化再用分解减少冗余和异常

  1. 01说明关系数据理论要解决的两个设计问题
  2. 02从业务语义写出函数依赖并识别候选码
  3. 03区分完全、部分和传递函数依赖
  4. 04判断主属性、非主属性并用依赖判断范式
  5. 05解释 1NF 到 4NF 的规范化层级与 BCNF 反例
  6. 06通过分解减少冗余和更新异常,并说明后续验证边界
2/16
LEARNING OBJECTIVES

一个大关系可能同时描述太多事实

这个模式把学生、学院和选课事实放在一起,因此同一事实会在多行重复

异常事实混合结果
冗余学生、学院和选课院长信息重复
插入只有学院没有学生大关系没有独立学院事实的存放位置
删除删除最后一个学生学院信息一起丢失
更新更换院长需要修改大量重复行
3/16
DESIGN PROBLEM

关系模式还要写明属性间的必然依赖

R(U,F) 的任意可能实例,若两个元组在 X 上相同,它们在 Y 上也必须相同

Takeaway

X 是决定因素;Y⊆X 时为平凡依赖,否则为非平凡依赖;函数依赖属于模式语义,不能只凭当前表无冲突就断言成立

4/16
FUNCTIONAL DEPENDENCY

码确定身份,依赖类型解释异常

先找码,再标出主属性与非主属性,最后判断依赖类型

候选码与超码

候选码决定全部属性且不可再约简;超码包含某个候选码

主属性与非主属性

出现在任一候选码中的是主属性,其余为非主属性

完全依赖

不能删去决定因素中的任何属性

部分与传递

依赖组合码的一部分,或经中间属性间接依赖码

Takeaway

本例候选码:(Sno,Cno);非主属性:School、Mname、Grade

5/16
KEYS AND DEPENDENCIES

范式是对依赖问题逐层收紧的标准

规范化用分解分开多个概念;是否无损连接还需要单独证明

从混合事实的大关系分解为学生、选课和学院关系
Takeaway

4NF ⊂ BCNF ⊂ 3NF ⊂ 2NF ⊂ 1NF

6/16
NORMAL FORMS

范式层级各自限制什么

层级逐步收紧;高范式同时满足较低范式

范式主要消除记忆入口
1NF非原子分量每个分量是原子值
2NF部分函数依赖非主属性完全依赖候选码
3NF非主属性传递依赖非主属性不传递依赖候选码;主属性被非码决定仍可能允许
BCNF非码决定因素每个决定因素都包含某个候选码
4NF非平凡多值依赖多值依赖的决定因素包含某个候选码
7/16
NORMAL FORMS

2NF 消除组合码上的部分依赖

候选码是 (Sno,Cno)SchoolSlocGrade 是非主属性

依赖判断原因/分解方向
(Sno, Cno) → Grade完全依赖Sno、Cno 都不能单独决定 Grade;留在 SC
(Sno,Cno) 对 School部分依赖因为 Sno→School;移到 S-L
(Sno,Cno) 对 Sloc部分依赖因为 Sno→Sloc;移到 S-L
Takeaway

2NF 分解为 SC(Sno,Cno,Grade) 与 S-L(Sno,School,Sloc);S-L 的候选码是 Sno

8/16
SECOND NORMAL FORM

3NF 消除非主属性对码的传递依赖

在 S-L(Sno,School,Sloc) 中,Sno 是候选码,Sloc 是非主属性

原关系

S-L(Sno, School, Sloc) 重复学院与宿舍信息

分解后

S-SS(Sno, School)S-SL(School, Sloc) 各自描述一个事实

9/16
THIRD NORMAL FORM

BCNF:每个非平凡依赖的左部都是超码

STJ(S,T,J) 让 3NF 与 BCNF 的差异变得具体

判断3NFBCNF
检查 T → JJ 是主属性,可以接受T 不是超码,不能接受
关注对象非主属性对码的依赖所有非平凡函数依赖
结果可能仍有异常函数依赖范围内更彻底分离
Takeaway

T→J 满足 3NF 但违反 BCNF;可分解为 ST(S,T) 与 TJ(T,J),还需要另外验证无损连接和依赖保持

10/16
BCNF

BCNF 之后还可能有独立多值事实

当教师集合与参考书集合彼此独立时,Teaching 会产生组合冗余

一门课程的教师集合与参考书集合形成组合冗余
Takeaway

在完整关系 Teaching(Course,Teacher,Book) 上,Course→→TeacherCourse→→Book 表示两个值集合彼此独立;它们不是“Course 唯一决定一个教师”的函数依赖

11/16
MULTIVALUED DEPENDENCY

4NF 消除非平凡且非函数的多值依赖

4NF 把独立事实拆到各自关系中,并要求先明确全码和多值依赖的决定因素

原关系或操作问题分解后的效果
Teaching(Course, Teacher, Book)BCNF 可通过,但 Course→→Teacher 使 4NF 不通过CourseTeacher + CourseBook
同一课程增加教师需要为每本书插入一行只在 CourseTeacher 增加一行
删除一本书可能误删教师事实只删除 CourseBook 中的一行
Takeaway

分解为 CourseTeacher(Course,Teacher) 与 CourseBook(Course,Book);多值依赖只在给定完整关系模式时讨论

12/16
FOURTH NORMAL FORM

规范化减少异常,但不是越高越好

规范化评价还要同时考虑依赖保持和无损连接,不能只看范式等级

收益

同一业务事实尽量只维护一处,减少冗余和更新异常

代价

常用查询可能需要更多连接,读取路径和调优成本会增加

设计判断

先守住一致性与异常边界,再结合业务、访问路径与运行环境取舍

Takeaway

属性闭包、依赖保持和无损连接可以继续验证分解结果

13/16
NORMALIZATION TRADEOFF

用依赖、范式和分解判断模式质量

规范化根据依赖语义把混合事实分解为边界更清晰的关系模式

FD 与候选码

先从业务事实写出函数依赖,再找候选码、主属性和非主属性

2NF 与 3NF

2NF 和 3NF 分别定位部分依赖与非主属性传递依赖

BCNF 与 4NF

BCNF 识别非码决定因素,4NF 识别独立多值事实

分解取舍

分解可以减少异常,但可能增加连接;依赖保持与无损连接还需要单独验证

Takeaway

属性闭包、依赖保持和无损连接准则可以继续验证设计

14/16
RECAP

本节知识地图

15/16
KNOWLEDGE MAP

本节问题

  1. 01对 S-L-C 写出候选码,并判断 (Sno,Cno)→Grade(Sno,Cno) 对 School 的依赖类型?
  2. 02说明 Sno→School→Sloc 为什么是传递依赖,S-L 为什么不满足 3NF?
  3. 03对 STJ 找出 (S,J)(S,T) 两个候选码,解释为什么 3NF 可接受而 BCNF 不接受 T→J
  4. 04给定一门课的两名教师和两本参考书,为什么会出现 4 条组合元组?
  5. 05说明 Teaching 为什么可满足 BCNF 但不满足 4NF,并写出两个分解关系?
  6. 06为什么还要用依赖保持和无损连接准则验证分解结果?
16/16
CHECK YOUR UNDERSTANDING