数据库系统原理
在关系模式R(U)中,对于U的子集X和Y,
如果X→Y,但Y 不包含于 X,则称X→Y是非平凡的函数依赖
若X→Y,但Y 包含于 X, 则称X→Y是平凡的函数依赖
例:在关系SC(Sno, Cno, Grade)中,
非平凡函数依赖: (Sno, Cno) → Grade
平凡函数依赖: (Sno, Cno) → Sno
(Sno, Cno) → Cno
(通常,我们总是讨论非平凡的函数依赖)
在R(U)中,如果X→Y,并且对于X的任何
一个真子集X’,都有X’ -\->Y, 则称Y对X完全函数依
赖,记作X -F-> Y。
若X→Y,但Y不完全函数依赖于X,则称Y对X部分
函数依赖,记作X -P-> Y。
例:
依赖关系{(Sno,Cno)→Grade,(Sno,Cno)→Sdept,Sno →Sdept}
则:
①(Sno,Cno)-F->Grade完全函数依赖,
②∵(Sno,Cno)→Sdept,Sno →Sdept且Sno真包含于(Sno,Cno)
∴(Sno,Cno)-P->Sdept部分函数依赖
在R(U)中,如果X→Y,(Y 不包含于X) ,Y-\->X
Y→Z, 则称Z对X传递函数依赖。
记为:X-传递-> Z
注: 如果Y→X, 即X←→Y,则Z直接依赖于X。
例:
Sno → Sdept,Sdept → Mname( Sdept-\->Sno)
Sno-传递->Mname
设K为R(U,F)中的属性或属性组合。若K -F->U, 则K称为R的侯选码
若候选码多于一个,则选定其中的一个作为主码
包含在任何一个候选码中的属性,称为主属性
不包含在任何码中的属性称为非主属性或非码属性
整个属性组是码,称为全码
如果一个关系模式R的所有属性都是不可分的基本数据项,
则R∈1NF
若R∈1NF,且每一个非主属性完全函数依赖于候选码,
则R∈2NF。
若R ∈2NF,且它的任何一个非主属性都不传递地依赖于任何候选码,
则R∈3NF
关系模式R(U,F)∈1NF,若X→Y且Y包含于X时,X必含有码,
则R(U,F) ∈BCNF
等价于:每一个决定因素都包含候选码
例:
在关系模式SJP(S,J,P)中,S表示学生,J表示课程, P表示名次。
n F:{(S,J)→P,(J,P)→S}
候选码: (S,J), (J,P);
S,J,P都是主属性
没有非主属性部分依赖或传递依赖于候选码
∴ STJ∈3NF
∵对F中任意一个X→Y,X都是候选码,
∴ STJ∈BCNF
若X→→Y,而Z为非空集,则称X→→Y为
【非 平凡】的多值依赖。
若X→→Y,而Z为空集(即U=X+Y),则称X→→Y
为平凡的多值依赖。
关系模式R(U,F)∈1NF,如果对于R的每个【非平凡】多值依赖X→→Y(Y不包含于X),
X都含有码,则R∈4NF。
例: Teaching(C,T,B)不属于4NF
存在非平凡的多值依赖C→→T, C→→B
且C不是码
用投影分解法把Teaching分解为如下两个关系模式:
CT(C, T) ∈ 4NF
CB(C, B) ∈ 4NF
R(A,B,C,D),F{B→D,AB→C}
候选码AB,非主属性C,D
∵存在非主属性对候选码的部分依赖
∴ R∈1NF
关系模式R(S#, SD, SL)
函数依赖:{S#→SD,SD→SL}
候选码:S#,非主属性SD,SL
∵ SL传递函数依赖于S#,
∵ 不存在SL中存在非主属性对码的部分函数依赖。
∴R∈2NF
R(A,B,C,D),F{B→D,D→B ,AB→C}
候选码:AB,AD ,非主属性C
∵ B→D,B不是候选码
∴不属于BCNF
∵不存在非主属性对候选码的部分或传递依赖
∴ R∈3NF
R(A,B,C),F{A→B,B→A ,A→C}
候选码: A,B 非主属性C
∵ 对任意一个X→Y,X都是候选码
∴ R∈BCNF
对于一个R(U,F),由F逻辑蕴涵的所有
函数依赖称为F的闭包,记作F+
对于R<U,F>,其中:U={X,Y, Z}, F={X→Y, Y→Z}}
若F+={
X→φ, Y→φ, Z→φ, XY→φ, XZ→φ, YZ→φ, XYZ→φ,
X→X, Y→Y, Z→Z, XY→X, XZ→X, YZ→Y, XYZ→X,
X→Y, Y →Z, XY→Y, XZ→Y, YZ→Z, XYZ→Y,
X→Z, Y→YZ, XY→Z, XZ→Z, YZ→YZ, XYZ→Z,
X→XY, XY→XY, XZ→XY, XYZ→XY,
X→XZ, XY→YZ, XZ→XZ, XYZ→YZ,
X→YZ, XY→XZ, XZ→XY, XYZ→XZ,
X→XYZ, XY→XYZ,XZ→XYZ, XYZ→XYZ
},
例:
设有关系模式R ( A , B , C , D ) ,
F={B→A,D→C},则F+中左部为(BC)的函
数依赖有8个
BC+={B,C,A} 2^3=8
关系模式R(U,F),U={A,B,C},F={A→B,B→C}
如果X={A},则属性集闭包:
X +F={A,B,C}
如果X={B},则属性集闭包
X +F={B,C}
如果X={C},则属性集闭包
X +F={C}
设有关系模式R(A,B,C,D),其上的函数依赖集:
F={A→C,C→A,B→AC,D→AC},试计算: (AD)+
令X={AD},
X(0)={AD},
X(1)={ACD},
X(2)={ACD}= X(1) ,
故(AD)+={ACD}
求Fm ={B→G, CE→B, C→A, CE→G, B→D,C→D}的候选键。
1、只在左端出现的属性:CE,(M=CE)
2、只在右端出现的属性:ADG,(N=ADG)
3、余下的属性:B,(W=B)
4、R的候选键只可能是CE或CEB
5、计算CE+F=U,CE是候选键
1.设有关系模式R(U,F),U={A,B,C,D,E},
F={AB→E,DE→B,B→C,C→E,E→A}
1).计算F中所有函数依赖左部属性集的闭包;
1)、(AB)+={A,B,C,E}; (DE)+={A,B,C,D,E}
B+={A,B,C,E};C+={A,C,E};E+={A,E}
2).确定关系模式R上的所有侯选码
2)、关系模式R上的所有侯选码;DE,DB,DC
设F和G是两个函数依赖集:
①如果F 包含于G +,则称G是F的一个
覆盖,或称G覆盖F;
②如果 F 包含于 G + 和 G 包含于 F + 同时成立,即F +=G +,
则称F和G等价。
设G和F是两个函数依赖集,F与G等价的充要条件是
F包含于G+ 且 G包含于F+
将较【低】等级的关系模式 分解为 若干个较【高】等级的关系模式过程称为 模式分解。
模式分解的方法并不是唯一的。
关系模式分解的目标: 【无损连接性】 和 【 函数依赖保持性】
所谓分解的【无损连接性】:若将R(U,F)分解为K个子模式:ρ={R1(U1,F1),R2(U2,F2),…,Rk(Uk,Fk)},
这K个子模式进行连接运算后,还可恢复为模式R。即:对R中满足F的每一个关系r,都有
r=πR1(r) πR2(r) … πRk(r)
所谓分解的【函数依赖保持性】:若将R(U,F)分解为
K个子模式:ρ={R1(U1,F1),R2(U2,F2),…,Rk(Uk,Fk)},
则Fi(0<=i<=K)并集与F等价。
只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义。
例:
关系R(U,F),U={S#,SD,MN},F={S#→SD,SD→MN}
1、对R进行分解:ρ1={R1(S#),R2(SD),R3(MN)}
存在问题:
A、原先的【函数依赖关系不存在】。
B、R1XR2XR3笛卡尔积,元组增加,【不具无损连接】。
2、对R进行另一分解:ρ2={R1(S#,SD),R2(S#,MN)
ρ2对R的分解是可恢复的,【具有无损连接性】
存在问题:SD→MN依赖关系丢失,【不具函数依赖保持性】
3、对R的分解:ρ3={R1(S#,SD),R2(SD,MN)}
既【具无损连接】,又【保持函数依赖】,同时解决插入、删除、更新异常
R(U,F),U={A,B,C,D,E},F={AB→C,C→D,D→E},
R的一个分解为
R1(A,B,C), R2(C,D), R3(D,E)。
------A--- B---- C---- D ---E
R1 -a1- a2 ---a3 ---b14- b15
R2 b21 -b22--a3 ---a4-- b25
R3 b31 -b32 -b33 --a4 --a5
由C→D 【注释:找到 在C列中有相同符号 的行 有R1,R2;
然后在R1,R2中看是否存在一个在D列有a4,有则R1,R2行的D列全部改为a4,否则改为b14】
------A--- B---- C---- D ---E
R1--a1- a2 ---a3 --a4--- b15
R2 b21 -b22 -a3-- a4--- b25
R3 b31- b32- b33- a4 ---a5
由D→E【注释:找到 在D列中有相同符号 的行 有R1,R2,R3;
然后在R1,R2,R3中看是否存在一个在E列有a5,有则R1,R2,R3行的D列全部改为a5,否则改为b15】
------A--- B---- C---- D ---E
R1 a1 --a2--- a3--- a4 --a5
R2 b21- b22- a3--- a4 --a5
R3 b31 -b32 -b33- -a4-- a5
如果某次更改后,有一行成为a1,a2,……,an。则ρ具
有无损连接性,否则ρ不具有无损连接性。
设有关系模式R(A, B, C, D, E), 并有函数依赖
{AB→D, AC→E, BC→D,D→A,E→B},现将R分解成关
系模式S(A, B, C)和其他一些关系模式,请给出在关
系模式S上成立的函数依赖。
∵ AB→D,D→A Þ AB→ A(平凡的函数依赖,删)
∵ AC→E, E→B Þ AC→ B
∵ BC→D, D→A Þ BC→ A}
∴ FS={AC→ B, BC→ A}
设有关系模式R(ABC),ρ={AB,AC}是R的一个分解
。试分析分别在F1={A→B},F2={A→C,B→C},F3={B→A}
,F4={C→B,B→A}情况下,ρ是否具有无损分解和保持
FD的分解特性。
F1:是无损分解且保持FD集的分解。
F2:是无损分解,但不保持FD集的分解。B→C丢失。
F3:是有损分解,但保持FD集的分解。
F4:是有损分解且不保持FD集的分解。C→B丢失
规范化理论提供了一套模式分解算法,按这些算法可以做到:
⒈ 若要求分解具有【无损连接性】,模式分解【一定】可以达到【4NF】(在函数依赖范畴,一定可达到BCNF)。
⒉若要求分解【保持函数依赖】,模式分解【一定】可以达到【3NF】,但不一定能够达到BCNF。
⒊若要求分解既要【保持函数依赖】,又具有无损连接性,模式分解【一定】可以达到【3NF】,但不一定能够达到BCNF。
一.分解成【3NF】,并【保持函数依赖】的分解算法:
1)对R(U,F)中的F进行极小化处理。
2)找出不在F中出现的属性,形成一个关系模式。
3)对F按具有相同左部的原则分组Fk,Fk所涉及的属性集Uk,
若 Ui包含于Uj 且 i≠j ,
则去掉Ui,合并Fi, Fj ,对每个Ui形成子模式Ri。
例:
例2:关系模式R(U,F),其中F={BE→G,BD→G,CDE→AB,CD→A,CE→G,BC→A,B→D,C→D},将R分解到3NF并具有函数依赖保持性。
1)对R(U,F)中的F进行极小化处理。Fm={B→G,CE→B,C→A,B→D,C→D}
候选键是CE。
2)找出不在Fm中出现的属性,形成一个关系模式。
3)对Fm按具有相同左部的原则分组Fk,Fk所涉及的属性集Uk,
分解成三个模式,Ri∈3NF且具有函数依赖保持性。
R1:U1=BDG,F1={B→G,B→D}
R2:U2=ACD,F2={C→A,C→D}
R3:U3=BCE,F3={CE→B}
二.分解成【3NF】,既有【无损连接性】又【保持函数依赖性】算法
(1)调用算法一产生R的分解ρ={R1…Rn}
(2)构造分解τ={ R1,…,Rn ,RK},其中RK是由R的一个候选键K构成的关系
关系模式R(U,F),其中F={BE→G,BD→G,CDE→AB,CD→A,CE→G,BC→A,B→D,C→D},将R分解到3NF并既具有无损连接性又保持函数依赖性。
1)Fm={B→G,CE→B,C→A,B→D,C→D},候选键是CE,
【注释算法一得到的
R1:U1=BDG,F1={B→G,B→D}
R2:U2=ACD,F2={C→A,C→D}
R3:U3=BCE,F3={CE→B}】
2)【注释:构造分解τ={ R1,…,Rn ,RK},其中RK是由R的一个候选键K构成的关系】
R1:U1=BDG,F1={B→G,B→D}
R2:U2=ACD,F2={C→A,C→D}
R3:U3=BCE,F3={CE→B}
R4:U4=CE,因R4的属性包含在R3中,可删去。
Ri={ R1,R2,R3 }∈3NF,且分解既有无损连
接性又保持函数依赖性。
三、具有无损连接性的BCNF分解算法
输入:关系模式R(U,F)
算法:ρ={R1…Rn}
循环:
若.( ρ中存在非BCNF的关系模式 )
{
选一个非BCNF模式Rj∈ρ;
选Rj的一个违反BCNF要求的函数依赖X→Y【注释:X 不包含 码/候选码/主键】
把Rj分解得ρ2={Rt,Rm}, Ut=XY;Um= Uj-{Y}
并用ρ2={Rt,Rm}代替ρ中的Rj;
}
停.(ρ中不存在非BCNF的关系模式)
例:STJ(学生S,教师T,课程J)每门课程可有多位教师上课、每位教师只上一门课。
F:{(S,J)→T,(S,T)→J,T→J}
候选键:(S,J)、(S,T),
∵STJ ∈3NF,不属于BCNF
对不满足BCNF的依赖关系:T→J【注释:T 不包含 码/候选码,*注意区分T 包含于 码/候选码】
分解得
{ TJ(T,J), ST(S,T)} ∈BCNF
该分解且具有【无损连接性】。
【不保持函数依赖关系】丢失:(S,J)→T,(S,T)→J
例:
R(I,J,K,L,M,N)
F={K→M,J→N,JK→L,N→I}
分解R 使属于BCNF且具有无损连接性。
∵JK+=JKLMNI(J+=JNI,K+=KM)
∴JK是R的主键
分解算法
---1、取N→I,N不是主键/候选码
S1={N,I}∈BCNF , F1={N→I}
S2={JKLMN},F2={K→M,J→N,JK→L}
S2中JK+=JKLMN ∴JK是 主键/候选码
---2、取K→M ,K不是 主键/候选码
S21={K,M}∈BCNF, F21={K→M}
S22={JKLN},F22={J→N,JK→L},JK是 主键/候选码
---3、取J→N,J不是 主键/候选码
S221={J,N} ∈BCNF ,F221={J→N}
S222={J,K,L} ∈BCNF ,F222={JK→L}JK是 主键/候选码
∴对R的分解ρ={S1、S21、S221、S222}∈BCNF
具有【无损连接性】,且【保持函数依赖】。
四.具有【无损连接性】的4NF分解算法
分解算法:ρ={R1…Rn}
循环:
若.(ρ中存在非4NF关系)
{
选择一个非4NF模式S∈ρ
选择Rj的一个违反4NF要求的多值依赖X→→Y
把Rj分解得ρ2={Rt,Rm}, Ut=XY;Um= Uj-{Y}
并用ρ2={Rt,Rm}代替ρ中的Rj;
}
停.(ρ中不存在非4NF关系)
例:
R(U)=R(A,B,C),D={A→→B,A→→C}
指出R不属于4NF,分解R使属4NF,具有无损连接性
⑴ R(A,B,C)不属于4NF
存在非平凡的多值依赖A→→B,A→→C
且A不是码
⑵对A→→B
R1(A,B)
R2 (A,C)=U-B,
ρ={R1,R2}∈4NF
例:
R=(A,B,C),D={AB→C,C→→A}
问R∈?NF,将R分解到4NF且具有无损连接性。
主键AB, R∈BCNF
分解CA(C,A),
CB(B,C) ∈4NF
以上子模式属4NF且具有无损连接性。
函数依赖关系丢失。
如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集。
亦称为最小依赖集或最小覆盖。
(1) F中任一函数依赖的右部仅含有一个属性。
(2) F中不存在这样的函数依赖X→A, X有真子集Z使得
F-{X→A}∪{Z→A} 与 F 等价。
(3) F中不存在这样的函数依赖X→A,使得
F 与 F-{X→A} 等价。
定理:每个函数依赖集合F均等价于一个最小函数依赖集合Fm
极小化过程
例:求F={BE→G,BD→G,CDE→AB,CD→A,CE→G,BC→A,B→D,C→D}
的最小函数依赖集合Fm
解:
1)先分解右端, F={B→G,CE→B,CD→A,B→D,C→D}
2)C+F=CDA,包含A, C→A代替CD → A
3)从左向右逐一检查F中的函数依赖是否多余
令:Fm ={B→G,CE→B,C→A,B→D,C→D}
例:求F={A→BC,B→AC,C→A}的最小函数依赖集合Fm
解:
1)先分解右端,
F= {A→B,A→C,B→A,B→C,C→A}
2)左端都为单属性
3)从左向右逐一检查F中的函数依赖是否多余:
设G=F-{A→B},
A+G =AC,不包含B, A→B保留
设G=F-{A→C},
A+G =ABC,包含C, A→C删除,
令F=G={A→B,B→A,B→C,C→A}