Professional Documents
Culture Documents
第7章 关系数据库的规范化理论
第7章 关系数据库的规范化理论
关系数据库的规范化理论
刘红岩
清华大学经济管理学院
管理科学与工程系
关系模式的规范化理论
主要内容:
基本概念
函数依赖
Armstrong公理系统
闭包、最小覆盖
2NF 、3NF、BCNF
多值依赖、4NF
基本概念
更新异常问题
Courses(cID, cName, credit, preCID) 主键
cID cName credit preCID
c1 C语言 2
c2 数据结构 3 c1
c3 数据库原理 3 c2
c3 数据库原理 3 c5
c4 商务智能 2 c3
c5 计算机概论 2
更新异常问题
设有一个关系模式 salesperson,候选键?
emp emp sex birthday spTelNo branch branch branch
ID Name ID Name TelNo
sp1 Connie Liu F 70-1-20 13901082345 B101 Haidian 62525668
sp2 Philip Li M 67-5-2 13901213146 B101 Haidian 62525668
sp3 Jane He F 62-9-7 13805352210 B101 Haidian 62525668
sp4 Tom Zhao M 72-12-9 13022654523 B102 Chaoyang 64427202
sp5 Lily Wang F 75-3-8 13685653369 B102 Chaoyang 64427202
sp6 Peter Li M 62-7-5 13312650852 B103 Xicheng 68683326
存储冗余(redundant storage)
更新异常问题
插入异常(insertion anomalies)
插入一个新的元组
删除异常(deletion anomalies)
删除编号为sp6的销售员
修改异常(modification anomalies)
修改异常是指对冗余的数据进行修改很容易
造成数据的不一致
emp emp sex birthday spTelNo branch branch branch
ID Name ID Name TelNo
sp1 Connie Liu F 70-1-20 13901082345 B101 Haidian 62525668
sp2 Philip Li M 67-5-2 13901213146 B101 Haidian 62525668
sp3 Jane He F 62-9-7 13805352210 B101 Haidian 62525668
sp4 Tom Zhao M 72-12-9 13022654523 B102 Chaoyang 64427202
sp5 Lily Wang F 75-3-8 13685653369 B102 Chaoyang 64427202
sp6 Peter Li M 62-7-5 13312650852 B103 Xicheng 68683326
更新异常问题
如何解决这些问题?
Salesperson (empID, empName, sex, birthday, spTelNo,
brachNo)
Branch (branchID, branchName, branchTelNo)
更新异常问题的原因?
数据依赖:数据之间存在着某种内在的联
系
如: empID和 branchID
如,cID, cName
函数依赖
Functional Dependency
规范化理论
每一个分量都是不可分的,这是最基本
的规范化
若R属于第几范式,一般记为RxNF
一个低一级范式的关系模式,通过模式
分解总可以将它分解为若干个高一级范
式的关系模式的集合,这种过程就叫规
范化(normalization)。
函数依赖 (functional dependency)
定义7.1: 设A和B是关系模式R的两个非空属
性组,如果A的每一个取值只对应B的一
个取值,则称
A函数决定B (A functionally determines B), 简称A
决定B,或
B函数依赖于A ( B is functionally dependent on A)
记为A→B
A称为B的决定子或决定因素(determinant)
若Y不函数依赖于X,则记作 X→Y
函数依赖 (functional dependency)
emp emp sex birthday spTelNo branch branch branch
ID Name ID Name TelNo
sp1 Connie Liu F 70-1-20 13901082345 B101 Haidian 62525668
sp2 Philip Li M 67-5-2 13901213146 B101 Haidian 62525668
sp3 Jane He F 62-9-7 13805352210 B101 Haidian 62525668
sp4 Tom Zhao M 72-12-9 13022654523 B102 Chaoyang 64427202
sp5 Lily Wang F 75-3-8 13685653369 B102 Chaoyang 64427202
sp6 Peter Li M 62-7-5 13312650852 B103 Xicheng 68683326
empName ? birthday
检验A → B在R中是否成立:对于R的任一个关系
r,如果r中任意两个元组t1和t2都满足:若t1[A]=
t2[A],则t1[B]= t2[B]。那么A → B成立。
一一对应
定义7.2: 如果AB,并且B A,则称A和B
一一对应,记作AB。
branchID branchName
branchName branchID
↓
branchID branchName
Other example?
非平凡函数依赖 (Nontrivial Dependencies)
sex, empName sex, empName
sex, empName sex
sex, empName empName ……
定义7.3:如果A B,并且BA,则称此函
数依赖为平凡的函数依赖(trivial
functional dependancy)
与此对应,A B,但B不是A的任一个子集,
则称A B为非平凡的函数依赖。
一般不特殊指明的情况下,我们总是讨论非平凡函
数依赖
部分函数依赖
定义7.4:如果A B,并且B不依赖于A的任
何非空真子集,则称B完全函数依赖于A,
函数依赖,A B是完全函数依赖(fully
functional dependency)。
A f >B
如果存在A的某个真子集C,C B,则称A
B 是 部 分 函 数 依 赖 ( partial
dependency),B部分依赖于A。
A p >B
例如:empID sex,empID, empNamesex
传递函数依赖
定义7.5:如果A B,B A,B C,则称C通过
B传递函数依赖于A,或简称C传递函数依赖于
A,函数依赖A C称为传递依赖(transitive
dependency)。
例如:empID branchID, branchIDbranchName
empID branchName
如果B A同时成立,则A和B是一一对应,A
C就不是传递依赖了,即C是直接依赖于A。
例如:branchID branchName
branchNamebranchTelNo
branchIDbranchTelNo
Armstrong公理系统
Armstrong’ Axioms
函数依赖集的闭包(closure)
如何找出所有的函数依赖?
定义7.6:一个函数依赖集F的闭包(closure)
是F所逻辑蕴涵的所有的函数依赖的集合,
记为F+。即F+={X→Y | F|=X→Y }
The set of all FDs that are implied by a
given set F of FDs is called the closure
of F, written F+.
函数依赖集的闭包(closure)
设F是R的函数依赖集合,X→Y是R的一
个函数依赖,如果一关系模式满足F,则
必然满足X→Y,则称F逻辑蕴涵X→Y,
表示为F|=X→Y。
例如 :
F={empID→branchID, branchID→branchName}
F |= empID→branchName
Armstrong’ Axioms
假设A、B、C和D是关系模式R的四个属性
组,Armstrong公理包括三条推理规则:
自反律(reflexivity):若AB,则AB。
自含律(Self-determination)AA
增广律(augmentation):若AB,则对任意
的属性组C,ACBC成立。
传递律(transitivity):若AB和BC成立,
则AC成立。
Armstrong 公理
①若AB,则AB
设t1,t2是R中任意两个元组。若t1[A]=t2[A],则
由于BA,所以t1[B]=t2[B],故A→B成立。
如: branchID, branchName → branchID
B A
emp emp sex birthday spTelNo branch branch branch
ID Name ID Name TelNo
一个只出现在函数依赖的右边的属性
Review
更新异常
函数依赖: 决定因素
非平凡函数依赖、一一对应
部分依赖、传递依赖
Armstrong公理
自反、增广、传递
合并、分解、伪传递
函数依赖集F的闭包
要判断一个函数依赖AB是否被F所逻辑蕴涵,
可以先求出F+,然后检查F+是否包含AB。
但是,当F包括很多个函数依赖时,F+是很难求出
的
假设有这样一个函数依赖XY1Y2…Yn,其中Yi
(i=1, 2, …, n)是单个属性,则根据分解律,可
以得到形如XZ (ZY1Y2…Yn)的函数依赖的个
数?
由此可见,求F+是一件很费时的工作
属性组的闭包
定义7.7:设A是关系模式R(U, F) 的一个
属性组,A关于F的闭包,记为A+ ,定义
为满足AB的所有属性B的集合,其中,
AB是根据Armstrong的推理规则可以从F
推导出的。
引理:A→B可由Armstrong公理导出的充
分必要条件是B A+。
算法7.1:属性组的闭包的计算
已知关系模式R(U,F),其中U代表R的所有属
性组成的属性集,F是U上的函数依赖集,
属性组AU的闭包A+的计算方法:
s1=A;
do{
s0=s1;
if exists VW in F such that Vs0 and W-s0
s1=s1W;
} while (s0!=s1 and s1!=U);
output(s1);
闭包的计算
算法7.1:计算属性集A关于F的闭包A+。
输入:属性集AU,函数依赖集F。
输出:A+。
①初始化:s1=A;
②s0=s1, 求属性集B={X|(v)(w)(v→w F vs0
Xw}
③s1=Bs1, 若s1≠s0且s1 ≠ U ,则返回②继续计算。
④若s0=s1 或 s1=U ,则A+=s1,计算结束。
闭包的计算:example
例 : 设 R(U, F), U={A,B,C,D,E,G}, F={AB→C,
D→EG, C→A, BE→C, BC→D, CG→BD,
ACD→B, CE→AG}, 求BD+.
解:①初始化:s1=BD;
②s0=s1=BD, 找左部为BD的子集的函数依赖,只有
D→EG,故s1=BDEG.
③s1≠s0 ,s0=s1=BDEG. 找左部为BDEG的子集的函
数依赖,有D→EG,BE→C, 故s1=BDEGC.
④s1≠s0 ,s0=s1=BDEGC,找左部为BDEGC的子集
的 函 数 依 赖 , 有 C→A, BC→D, CG→BD,
CE→AG, 故s1=ABCDEG=U,不必继续迭代,计
算结束。
最小覆盖
一个函数依赖集F的闭包F+通常包含很多函数依赖,有些是
无意义的,如平凡的函数依赖,有些可由另外一些推导出
如果将每一个函数依赖看作对关系的一个约束,要检查F+中
的每一个函数依赖对应的约束,显然是一件很繁重的任务。
如果能找出一个与F等价的包含较少数目函数依赖的函数依
赖集G,则可以简化此工作。
定义7.8:F、G是关系模式R上的两个函数依
赖集,若F+=G+,则称F 和G 是等价的
( equivalent ),或G覆盖F,或F覆盖G,或
F和G相互覆盖。
最小覆盖的定义
定义7.9:一个函数依赖集G如果满足如下三
个条件,则称为函数依赖集F的一个最小覆盖。
① G中的每个函数依赖的右边是单个属性;
② G中不存在这样的函数依赖AB,使得
G-{AB}{VB} 与G等价,
其中V是A的真子集;
③ G中不存在这样的函数依赖AB,使得
G-{AB}与G等价;
最小覆盖
引理:任一函数依赖集F总可以为一右部恒为单属性
的函数依赖集所覆盖。
定理7.1:任一函数依赖集F都与一最小函数依赖集F’
等价,F’称为F的最小覆盖。
证明:只要能构造一个满足定义7.9的覆盖G,该定
理即得证。
(1)根据引理,F总可以为一右部恒为单属性的函
数依赖集所覆盖,设此覆盖为G1,则G1满足定义
7.9中的条件1。
最小覆盖
(2) 对G1中的每一个函数依赖AB检查:
是否存在A的某个真子集V使VB成立,而且
不存在任何V的真子集W使WB成立。如果
存在这样的V,则用VB替换AB。
如果VB成立,说明AB是一个部分依赖,
因此F中必定存在或可以推导出相应的完全依
赖VB,而由VB根据增广律可以得到
AB,因此将AB用VB替换的函数依赖
集与F是等价的。
处理后的函数依赖集记为G2。G2符合定义7.9
中的条件(1)和(2)。
最小覆盖
(3) 对G2中的每一个函数依赖AB进行如下
检查:通过函数依赖集G2-{AB}能否推
导出AB?如果可以,令G2=G2-{AB}。
经过以上步骤处理后的函数依赖集G2必定
满足定义7.9中的3个条件,因而得到了F的
最小覆盖
需要注意的是,F的最小覆盖不是唯一的.
最小覆盖:例7.6
设F是关系模式R(ABCD)的函数依赖集,
F={AC,BAC,BDA,DAC},求F的
最小覆盖。
1. 根据分解律将右部分解为单个属性, G1={AC,
CA,BA,BC,BDA,DA,DC};
2. 由G1中的BA,根据增广律可得BDA,故
BDA是部分依赖,可以删除,G2={ AC,
CA,BA,BC,DA,DC};
3. 对于G2中的BA,由BC和CA根据传递律
可以得出,因而冗余,从G2中删除;
对于DA,由DC和CA根据传递律也可以
得出,故应删除,这样得到了G3=={AC,
CA,BC,DC}。
最小覆盖:例7.6
在第3步中,若首先检查的是BC,则可以
发现它是冗余的,应该删去,接着也可以
在检查DA之前检查DC,则可以发现
DC是多余的。
为此根据检查的函数依赖的先后顺序不同,
还可以得到另外三个不同的最小覆盖如下:
G={AC,CA,BA,DC}
G={AC,CA,BC,DA}
G={AC,CA,BA,DA}
homework
1. 书后7.4。
一个有5个属性的关系模式R(ABCDE),函数依
赖集为F={A → BDE, CE → D, E → A}
2. 下面的结论哪些是正确的,哪些是错误的,错误
的给出一个反例。
① 若R(ABC),B →A,C→A,则BC →A
② 若R(ABC),AB →AC,则B →C
③ 若R(ABC),B C→A,则C→A,B →A
④ 若R(ABCD),A → B, C →D, 则AC →BD
范式
Normal Forms
1NF
1NF
emp emp sex spTelNo address branchI branch branch
ID Name D Name TelNo
sp2 13901213146
sp2 Philip M 海淀区 中关村 B101 Haidian 62525668
Li 南大街 branch sp2 62525662
sp3 13805352210
sp3 Jane F 朝阳区 樱花东 B101 Haidian 62525668
He 街 branch sp3 62525663
3NF
3NF
定义7.12:一个属于1NF的关系模式R,如果
不存在任何非主属性对候选键的传递函
数依赖,则关系模式R属于3NF,记为
R3NF。
3NF
若R3NF,则必有R2NF,反过来说,
如果一个关系模式R不属于2NF,则R必不
属于3NF。
若R2NF,则至少存在一个非主属性对候选键
的部分依赖,假设该部分依赖为A → C,其中A
是R的候选键,C为R的非主属性,而C完全依赖
于A的某真子集B,即B → C,由于BA,由自
反律可得:A → B,并且B A,否则A不是候
选键,因此,由A → B,B A,B → C,可知
A → C是个传递依赖,C通过B传递函数依赖于
A,因此R3NF。
3NF
例:
emp emp sex district street branchI branch branch
ID Name D Name TelNo
sp1 Connie F 海淀区 中关村 B101 Haidian 62525668
Liu 南大街 branch
street district
branchID branchName branchTelNo
中关村南大街 海淀区
樱花东街 朝阳区 B101 Haidian branch 62525668
朝阳门内大街 东城区
B102 Chaoyang branch 64427202
和平西街 朝阳区
崇文门外大街 崇文区 B103 Xicheng branch 68683326
BCNF
BCNF
BCNF (Boyce Codd Normal Form)是由Boyce和
Codd 提 出 的 , 它 比 3NF 又 进 一 步 , 通 常 认 为
BCNF是修正的第三范式,有时也称为3NF。
定义7.13: 一个属于1NF的关系模式R,对
于每个非平凡的函数依赖A→B, 若其决定
因素都是超键,则关系模式R属于BCNF,
记为RBCNF。
即,F中每一个决定因素都包含键,则R∈BCNF。
BCNF
若R∈BCNF,则R∈3NF
证明:假设R∈BCNF,但R不属于3NF。
若R不属于3NF,则存在非主属性Z对键X的传
递依赖,即:X->Y,Y不决定X,Y->Z。
由于Y不决定X,故Y不可能是候选键,
而若R∈BCNF,Y->Z,Y必须是超键,即Y肯
定决定X,结果互相矛盾,假设不成立。
若R∈3NF,则R不一定属于BCNF
BCNF
Order(orderNo, customerNo, empID, orderDate)
订单号、客户编号、负责该订单的销售员
的编号、订单提交的日期
如果每个订单只对应一个客户,但可以由多个销
售员共同负责,一个客户在一天内最多提交一个
订单,则存在的函数依赖包括:
orderNo→ (customerNo, orderDate)
(customerNo, orderDate) → orderNo
BCNF
关系模式Order的候选键有哪些?
(orderNo, empID)
(customerNo, orderDate, empID)
11 10005 2 06-10-5
11 10005 6 06-10-5
12 10002 1 06-10-12
BCNF
分解
(orderNo, empID)
(customerNo, orderDate, orderNo )
orderNo empID
orderNo customerNo orderDate
11 2
11 10005 06-10-5
11 6
12 10002 06-10-12
12 1
对于每个非平凡的?函数依赖A→B, 若
其决定因素都是超键
empID emp Name sex street branch No
sp1 Connie Liu F 中关村南大街 B101
sp2 Philip Li M 中关村南大街 B101
sp3 Jane He F 樱花东街 B101
sp4 Tom Zhao M 朝阳门内大街 B102
sp5 Lily Wang F 和平西街 B102
sp6 Peter Li M 崇文门外大街 B103
BCNF
在函数依赖的范围里,如果将一个数据库模式的
每一个关系模式R(U,F)依据规范化理论,分解为
一个关系模式的集合={R1, R2, …, Rk}代替,其
中R1 、R2、 …、Rk 每个都属于BCNF。那么在函
数依赖的范围里它已实现了彻底的分解,已清除
了由于函数依赖而引起的更新异常问题。
多值依赖
Multi-Valued Dependence
多值依赖
那么符合BCNF的关系模式就不会存在存储异常问
题呢?
例 关系Course(Cno,Tno,Bno)
一个课程由若干老师讲授,
一个老师讲若干门课,
每一课程都有一套固定的参考书
多值依赖
Cno Tno Bno
C1 T1 B1
C1 T1 B2
C1 T1 B3
C1 T2 B1
C1 T2 B2
C1 T2 B3
C2 T1 B1
C2 T1 B4
C2 T3 B1
C2 T3 B4
多值依赖
函数依赖
候选键?
course属于?NF
多值依赖
更新异常
重复:冗余
当要增加一名教师时,若相应的参考书多于一个,必
须插入多个元组。如增加一个教C1课的教师T3,必须
加添元组(C1,T3,B1)、(C1,T3,B3)、(C1,T3,B3);
同样要删掉某一个老师的一门课,如T3教师的C1课,
也必须删掉三个元组,很明显增删都不方便
原因:多值依赖(Multi-Valued Dependence )
多值依赖
定义7.14:假设A和B是关系模式R(U)的两个属性
组,若对于R的任一个关系r,A的每一个取值对
应B的一组取值,而这组取值与R的其他属性C
(C=U-AB)的取值是没有关系的,则称多值依赖
A→→B成立
例如,course(Cno,Tno,Bno)中,对于Cno的一个取
值C1,有一组Tno的取值{T1,T2}与之对应,它仅
取决于C1,而对于B上的值无关,故Cno→→Tno
。
多值依赖
Cno Tno Bno
例,course(Cno,Tno,Bno)
C1 T1 B1
对于Cno的一个取值C1,有
一组Tno的取值{T1,T2}与 C1 T1 B2
之对应,它仅取决于C1, C1 T1 B3
而对于B上的值无关,故 C1 T2 B1
Cno→→Tno 。 C1 T2 B2
C1 T2 B3
C2 T1 B1
C2 T1 B4
C2 T3 B1
C2 T3 B4
例子
关系模式为 BTL(branchID, branchTelNo, branchLeader)
每一个分支机构(branchID)可以对应多个联系电话
(branchTelNo),
每个分支机构(branchID)可有多个负责人
(branchLeader)
例子
branchID branchTelNo Branch
Leader
B101 62525668 sp1
B101 62525669 sp1
B101 62525668 sp2
B101 62525669 sp2
B102 62712689 sp3
B102 62712688 sp3
多值依赖
BID Tel Leader
B101 62525668 sp1
B101 62525669 sp1
B101 62525668 sp2
B101 62525669 sp2
属性BID的一个取值:B101,
对应属性Tel的两个取值:62525668和62525669,
而这两个取值与另一个属性Leader取值为sp1还是
sp2没有关系,因此多值依赖
branchID→→branchTelNo成立。
多值依赖
branchID→→branchTelNo BID Tel Leader
成立吗? B101 62525668 sp1
B101 62525669 sp1
B101 62525668 sp2
属性BID的一个取值:B101,
对应属性Tel的两个取值:62525668和62525669,
而这两个取值与另一个属性Leader取值为sp1还是
sp2有没有关系
多值依赖
检查多值依赖A→→B对于R(U)是否成立的另
一个方法为,检验下列式子对于A的每一个取值a
是否在R的任一个关系r中都成立。(C=U-AB )
πBC(σA=a(R))= πB(σA=a(R))πC(σA=a(R))
a=B101
BID Tel Leader Tel Leader
Tel Leader
B101 62525668 sp1 62525668 sp1
62525668 sp1
B101 62525669 sp1 62525669 sp1 = ×
62525669 sp2
B101 62525668 sp2 62525668 sp2
B101 62525669 sp2 62525669 sp2
多值依赖性质
R(U)
①互补律(complementation)
若A→→B成立,则A→→U-AB成立
例 BTL(BID,Tel,Leader), BID→→Tel ,
BID→→Leader
每个非平凡的多值依赖的左边都是超键
4NF
属于4NF的关系模式必然属于BCNF,反之,
不属于BCNF的关系模式必不属于4NF。
如果关系模式R不属于BCNF,则至少存在
一个非平凡的函数依赖A→B,其中A不是
超键,由复制律可知,多值依赖A→→B在
R中成立,且
A不是超键,
B不是A的子集(因为A→B是非平凡的函数依
赖),
AB≠U(否则A必是超键),
因而R不属于4NF。
4NF
Cno Tno Bno
例,course(Cno,Tno,Bno)
C1 T1 B1
Cno→→Tno
C1 T1 B2
Cno→→Bno
C1 T1 B3
C1 T2 B1
C1 T2 B2
C1 T2 B3
C2 T1 B1
C2 T1 B4
C2 T3 B1
C2 T3 B4
4NF
Cno Tno
例,course(Cno,Tno,Bno) C1 T1
C1 T2
分解为
C2 T1
R1(Cno,Tno)∈4NF,
C2 T3
R2(Cno,Bno)∈4NF.
Cno Bno
C1 B1
C1 B2
C1 B3
C2 B1
C2 B4
4NF
对BTL来说,存在两个非平凡的多值依赖:
branchID→→branchTelNo
branchID→→branchLeader
其左部都不是超键,因而不属于4NF,可以采用分
解的方式,分解为两个关系模式:
BT(branchID, branchTelNo)
BL(branchID, branchLeader)
A B C D E
a b c d e
a b 3 d e
a b c d 5
a b 3 d 5