目录
7. 关系数据库
第7章关系数据库上半部分总结:https://blog.csdn.net/u010257584/article/details/109742276
范式、无损连接和函数依赖是必须掌握的知识,也是历年真题必考知识点,所以,每一节的内容都很重要,加油学吧!
本章编辑真的难倒我了,数学符号较多,Markdown LateX数学公式要学一学,分享网友总结https://blog.csdn.net/coffee_cream/article/details/109599317。
7.5 规范化
范式关系:1NF⊃2NF⊃3NF⊃BCNF⊃4NF⊃5NF。
7.5.1 第一范式(1NF)
若关系模式R的每一个分量是不可再分的数据项,则关系模式R属于第一范式,记为R∈1NF。
同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
例如SC(sno,cno,sname,cname,grade)中,候选码为(sno,cno)。
F={(sno,cno)→grade,(sno,cno)→sname,(sno,cno)→cname,sno→sname,cno→cname}
存在的问题:
- 冗余度大,sno,sname,cno,sname都要与grade一样多。
- 因其修改操作的不一致性。
- 插入异常。
- 删除异常。
7.5.2 第二范式(2NF)
若关系模式R∈1NF,且每一个非主属性完全依赖于码,则关系模式R∈2NF.也就是2NF消除了1NF中非主属性对码的部分函数依赖。(属性完全依赖于主键,消除部分依赖)
第二范式表中的每个非键字段由整个主键确定,且不能由主键自身的一部分确定,因此,2NF的违例只会出现在主键是由超过一个字段构成的表中。
例如:在学生各课程学分关系中,SC(sno,cno,sname,cname,credit)关系分解为:Student(sno,sname)和Cource(cno,cname,credit),这两个关系模式就属于2NF。
7.5.3 第三范式(3NF)
若关系模式R(U,F)中若不存在这样的码X,属性组Y及非主属性Z(Z⊊Y)使X→Y,( Y ↛ X Y↛X Y↛X)Y→Z成立,则关系模式R∈3NF,即在2NF基础上消除非主属性对码的传递函数依赖。
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,即表中不存在可以确定其他非关键字的非键字段。(属性不依赖于其他非主属性)
7.5.4 巴克斯范式(BCNF)
关系模式R∈1NF,若X→Y且Y⊊X时,X必含有码,则关系模式R∈BCNF。当3NF消除了主属性对码的部分函数依赖和传递函数依赖,则称为BCNF。在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BCNF。
这个范式特别用于处理非键字段确定主键的一部分主要的情况。
BCNF关系模式性质:
- 所有非主属性对每一个码都是完全函数依赖;
- 所有主属性对每一个不包含它的码,也就是完全函数依赖;
- 没有任何属性完全函数依赖于非码的任何一组属性。
R属于3NF,不一定属于BCNF,如果R属于BCNF,一定属于3NF。
例如(来源网友分享):假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的,但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式,存在如下问题:
- 删除异常:当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。
- 插入异常:当仓库没有存储任何物品时,无法给仓库分配管理员。
- 更新异常:如果仓库换了管理员,则表中所有行的管理员ID都要修改。
改进,把仓库管理关系表分解为二个关系表:
仓库管理:StorehouseManage(仓库ID, 管理员ID);
仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
7.5.5 第四范式(4NF)
关系模式R∈1NF,若对于R的每个非平凡多值依赖X→→Y且Y⊊X时,X必含有码,则关系模式R∈4NF。4NF是限制关系模式的属性间不允许有非平凡且非函数依赖的多值依赖。
若关系中的某一属性组的值能唯一地表示一个元组,而其真子集不行,则称该属性组为候选码。在全键表中,键的一部分可以确定至多一个其他字段的多个值,4NF仅用于全键表。
多值依赖(multivalued dependency,MVD)的概念:指可以控制或确定另一个字段的多个值的一个或一组字段,多值依赖即属性之间的一对多关系,记为K→→A。
函数依赖事实上是单值依赖,所以不能表达属性值之间的一对多关系。
平凡的多值依赖:全集U=K+A,一个K可以对应于多个A,即K→→A。此时整个表就是一组一对多关系。
非平凡的多值依赖:全集U=K+A+B,一个K可以对应于多个A,也可以对应于多个B,A与B互相独立,即K→→A,K→→B。整个表有多组一对多关系,且有:“一”部分是相同的属性集合,“多”部分是互相独立的属性集合。
注意,如果只考虑函数依赖,关系模式最高的规范化程度是BCNF;如果考虑多值依赖,关系模式最高的规范化程度是4NF。
例如,学生关系(学号,选修课程,兴趣爱好)如下:
分解为:
学生1(学号,选修课程)∈4NF
学生2(学号,兴趣爱好)∈4NF
7.5.6 第五范式(5NF,不考)
满足第四范式(4NF)的基础上,当且仅当R的每一个非平凡的连接依赖都被R的候选码所蕴含,记作5NF(消除不是由候选码所蕴含的连接依赖)。如果关系模式R中的每一个连接依赖均由R的候选码所隐含,则称此关系模式符合第五范式。
总结(理解并记下来):
检查范式违例:
1.当某个字段包含多个值会发生1NF违例。
2.2NF违例只会发生在具有关联键的表中,且非键字段只依赖于主键的一部分。
3.3NF违例发生在一个非键字段确定另一个非键字段的情况下,表可能有一个任何大小的键。
4.BCNF违例出现在非键字段确定主键的一部分的情况下,这些违例只能发生在主键是由关联键组成的表中。
5.4NF违例发生在表的主键至少由3个键连接而成且没有非键字段的情况下,此外,键的一部分确定键的另一部分的多个值。
解决范式违例的方法:就是将复式的确定因子拆成单一的确定因子。
7.6 Armstrong公理系统
7.6.1 Armstrong公理系统
Armstrong公理系统设关系模式R<U,F>,其中U为属性集,F是U上的一组函数依赖,那么有如下推理规则:
- A1自反律:若Y⊆X⊆U,则X→Y为F所蕴含;
- A2增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含;
- A3传递律:若X→Y,Y→Z为F所蕴含,则X→Z为F所蕴含。
根据上面三条推理规则,又可推出下面三条推理规则: - 合并规则:若X→Y,X→Z,则X→YZ为F所蕴含;
- 伪传递规则:若X→Y,WY→Z,则XW→Z为F所蕴含;
- 分解规则:若X→Y,Z⊆Y,则X→Z为F所蕴含。
引理:X→A1A2…Ak成立的充分必要条件是X→Ai成立(i=1,2,…,k)。
1.函数依赖的闭包 F + F^+ F+及属性的闭包 X F + X_F^+ XF+
关系模式R(U,F)中为F所逻辑蕴含的函数依赖的全体称为F的闭包,记为 F + F^+ F+。
设F为属性集U上的一组函数依赖,X⊆U, X F + = { A ∣ X → A 能 由 F 根 据 A r m s t r o n g 公 理 导 出 } X_F^+=\{A|X→A能由F根据Armstrong公理导出\} XF+={ A∣X→A能由F根据Armstrong公理导出},则称 X F + X_F^+ XF+为属性集X关于函数依赖集F的闭包。
属性集X的闭包 X F + X_F^+ XF+是指所有能由X决定的属性集合。闭包就是由一个属性直接或间接推导出的所有属性的集合。
X F + X_F^+ XF+的算法:
(1)令 X 0 = X X^0=X X0=X,i=0;
(2)求B, B = { A ∣ ( ∃ v ) ( ∃ w ) ( V → W ∈ F ⋀ V ⊆ X i ⋀ A ∈ W ) } B=\{A|(∃v)(∃w)(V→W∈F⋀V⊆X^i⋀A∈W)\} B={
A∣(∃v)(∃w)(V→W∈F⋀V⊆Xi⋀A∈W)}
(3) X i + 1 = B ∪ X i X^{i+1}=B∪X^i Xi+1=B∪Xi
(4) X i + 1 = X i ? X^{i+1}=X^i? Xi+1=Xi?
(5)若相等或 X i = U X^i=U Xi=U,则 X i = X F + X^i=X_F^+ Xi=XF+,算法终止
(6)若不相等,i=i+1,返回(2)。
例:设有关系模式R(U,F),其中U={A,B,C,D,E},F={AB→C,B→D,C→E,CE→B,AC→B},计算 ( A B ) F + (AB)_F^+ (AB)F+。
解:由上述算法得:
( A B ) 0 = A B (AB)^0=AB (AB)0=AB
搜索F中的每一个函数依赖:AB→C,B→D,得 ( A B ) 1 = A B ∪ C ∪ D = A B C D (AB)^1=AB∪C∪D=ABCD (AB)1=AB∪C∪D=ABCD;
继续搜索F:C→E,得 ( A B ) 2 = A B C D ∪ E = A B C D E (AB)^2=ABCD∪E=ABCDE (AB)2=ABCD∪E=ABCDE;
至此全部找出,全码,结束。
2.候选码的求解方法
给定一个关系模式R(U,F), U = ( A 1 , A 2 , … , A n ) U=(A_1,A_2,…,A_n) U=(A1,A2,…,An),F是R的函数依赖集,那么可将其属性分为4类:
(1)L类:仅出现在函数依赖集F左部的属性。
(2)R类:仅出现在函数依赖集F右部的属性。
(3)LR类:在函数依赖集F左右两边均出现的属性。
(4)NLR类:在函数依赖集F左右两边均未出现的属性。
根据候选码的特性,对于给定一个关系模式R(U,F),可以得出结论如下:
结论1:若X( X ⊆ U X⊆U X⊆U)是L类属性,则X必为R的任一候选码的成员,若 X F + = U X_F^+=U XF+=U,则X必为R的唯一候选码。
结论2:若X( X ⊆ U X⊆U X⊆U)是R类属性,则X不是R的任一候选码的成员。
结论3:若X( X ⊆ U X⊆U X⊆U)是NLR类属性,则X必为R的任一候选码的成员。
结论4:若X( X ⊆ U X⊆U X⊆U)是L类和NLR类属性组成的属性集,若 X F + = U X_F^+=U XF+=U,则X必为R的唯一候选码。
候选码的求解方法:
(1)根据题意进行属性分类:
- L类一定是候选码成员
- R类一定不是候选码成员
- LR类可能是可能不是
- NLR类一定是候选码成员
(2)将所有的L类和NLR类属性组合,设为P,求 P F + P_F^+ PF+,如果值为全集U,那么它是候选码;
(3)如果值≠全集U,则依次将LR类属性跟P组合起来求闭包,只要其闭包是全集U,就是候选码。
例1:设关系模式R(A, B, C, D), 其函数依赖集:F={D→B, B→D, AD→B, AC→D},求R的所有候选码。
解:L类属性:A,C;LR类属性:B,D;因为L类属性一定为候选码成员且根据F可知AC→D、D→B,也就是 ( A C ) F + (AC)_F^+ (AC)F+=ACDB,所以AC是R的唯一候选码。
例2:设关系模式R(A, B, C), 其函数依赖集:F={AB→C, C→B},求R的所有候选码。
解:L类属性A,LR类属性B、C,那么A一定是候选码成员,但 ( A ) F + = A (A)_F^+=A (A)F+=A而非等于全集U,所以,需要将LR类属性跟L和NLR类属性组合看闭包情况,得 ( A B ) F + = U (AB)_F^+=U (AB)F+=U, ( A C ) F + = U (AC)_F^+=U (AC)F+=U,所以候选码为AB、AC。
例3:已知关系模型R<U,F>,其中U=(A,B,C,D,E,G),F={AB–>C,CD–>E,E–>A.A–>G},求R的候选码。
解:L类属性B、D;R类属性G;LR类属性A、C、E
所以G一定不是候选码成员,BD一定是候选码成员但 ( B D ) F + ≠ U (BD)_F^+≠U (BD)F+=U,所以需要尝试LR、L类和NLR的组合(ABD,BCD和BDE)求闭包,如果闭包是全集U,那么就是候选码。
计算可知ABD,BCD和BDE的闭包都是全集U,所以三个都是候选码,算法结束。
3.最小函数依赖集
定义:如果函数依赖集F满足下列条件,则称F为最小函数依赖集或最小覆盖。
(1)F中的任何一个函数依赖的右部仅含有一个属性,即右侧无多余的属性;
(2)F中不存在这样一个函数依赖X→A,使得F与F-{X→A}等价,即无多余的函数依赖;
(3)F中不存在这样一个函数依赖X→A,X有真子集Z使得F-{X→A}∪{Z→A}与F等价,即去掉各函数依赖左边的多余属性。
计算最小函数依赖集算法:
步骤:
(1)用分解的法则,使F中的任何一个函数依赖的右部仅含有一个属性;
(2)去掉多余的函数依赖:从第一个函数依赖X→Y开始将其从F中去掉,然后在剩下的函数依赖中求X的闭包 X + X^+ X+,看 X + X^+ X+是否包含Y,若是,则去掉X→Y;否则不能去掉,依次做下去。直到找不到冗余的函数依赖;
(3)去掉各依赖左部多余的属性。一个一个地检查函数依赖左部非单个属性的依赖。例如XY→A,若要判Y为多余的,则以X→A代替XY→A是否等价?若A(X)+,则Y是多余属性,可以去掉。
7.6.2 模式分解及分解后的特性
1.无损连接
分解相关定义参考教材P353,需要编辑的公式多,偷个懒就不写了。
无损联接分解是将一个关系模式分解成若干个关系模式后,通过自然联接和投影等运算仍能还原到原来的关系模式,则称这种分解为无损联接分解。
定理1:关系模式R(U,F)的一个分解 ρ = { R 1 ( U 1 , F 1 ) , R 2 ( U 2 , F 2 ) } ρ=\{R_1(U_1,F_1),R_2(U_2,F_2)\} ρ={ R1(U1,F1),R2(U2,F2)},具有无损连接充分必要条件是: U 1 ∩ U 2 → U 1 − U 2 ∈ F + 或 U 1 ∩ U 2 → U 2 − U 1 ∈ F + U_1∩U_2→U_1-U_2∈F^+或U_1∩U_2→U_2-U_1∈F^+ U1∩U2→U1−U2∈F+或U1∩U2→U2−U1∈F+。
例:有关系R(U,F),U={A,B,C},依赖关系F={A→B},判断 ρ 1 = { A B , B C } ρ_1=\{AB,BC\} ρ1={ AB,BC}和 ρ 2 = { A B , A C } ρ_2=\{AB,AC\} ρ2={ AB,AC}是否为无损分解。
对于 ρ 1 , A B ∩ B C = B , A B − B C = C , B C − A B = C , A B ∩ B C → ( A B − B C ) = B → A ∉ F + , A B ∩ B C → ( B C − A B ) = B → C ∉ F + ρ_1,AB∩BC=B,AB-BC=C,BC-AB=C,AB∩BC→(AB-BC)=B→A∉F^+,AB∩BC→(BC-AB)=B→C∉F^+ ρ1,AB∩BC=B,AB−BC=C,BC−AB=C,AB∩BC→(AB−BC)=B→A∈/F+,AB∩BC→(BC−AB)=B→C∈/F+所以它是有损分解;
对于 ρ 2 , A B ∩ A C = A , A B − A C = B , A C − A B = C , A B ∩ A C – > ( A B − A C ) = A → B ∈ F + ρ_2,AB∩AC=A,AB-AC=B,AC-AB=C,AB∩AC–>(AB-AC)=A→B∈F^+ ρ2,AB∩AC=A,AB−AC=B,AC−AB=C,AB∩AC–>(AB−AC)=A→B∈F+,所以它是无损分解。
注意 ρ 2 ρ_2 ρ2,对于,虽然 A B ∩ A C – > ( A C − A B ) = A → C ∉ F + AB∩AC–>(AC-AB)=A→C∉F^+ AB∩AC–>(AC−AB)=A→C∈/F+,但根据无损连接定理充要条件只要满足一个即可。
2.保持函数依赖
设关系模式R(U,F)的一个分解 ρ = { R 1 ( U 1 , F 1 ) , R 2 ( U 2 , F 2 ) , … , R k ( U k , F k ) } ρ=\{R_1(U_1,F_1),R_2(U_2,F_2),…,R_k(U_k,F_k)\} ρ={ R1(U1,F1),R2(U2,F2),…,Rk(Uk,Fk)},如果 F + = ( ∪ k i = 1 F i ) + F^+=(\underset{i=1}{\overset{k}{∪}}F_i)^+ F+=(i=1∪kFi)+,则称分解ρ保持函数依赖。( 对关系分解时,原关系的闭包与分解后关系闭包的并集相等)
将R<U,F>分解后,存在很多分解后的关系,例如分解为R1,R2,R3等。在R<U,F>中,F存在很多的函数依赖,如果F中的每一个函数依赖,都可以在分解后的R1,R2,R3上找到它的属性的话,那么这个分解是保持依赖的。如果找不到的话,还需要进一步去判断。
例1:设关系模式R<U, F>,其中U={A, B, C, D, E},F={A→BC,C→D,BC→E,E→A},则分解ρ={R1(ABCE),R2(CD)}满足( ) 。
A.具有无损连接性、保持函数依赖
B.不具有无损连接性、保持函数依赖
C.具有无损连接性、不保持函数依赖
D.不具有无损连接性、不保持函数依赖
(1)无损连接判断: R 1 ∩ R 2 = C , R 1 − R 2 = A B E , R 2 − R 1 = D , R 1 ∩ R 2 → R 1 − R 2 = C → A B E ∉ F + , R 1 ∩ R 2 → R 2 − R 1 = C → D ∈ F + R1∩R2=C,R1-R2=ABE,R2-R1=D,R1∩R2→R1-R2=C→ABE∉F^+,R1∩R2→R2-R1=C→D∈F^+ R1∩R2=C,R1−R2=ABE,R2−R1=D,R1∩R2→R1−R2=C→ABE∈/F+,R1∩R2→R2−R1=C→D∈F+,是无损连接。
(2)保持函数依赖判断:A→BC,BC→E,E→A都可以在R1中找到(每一个函数依赖左右两边的属性都在R1中),C→D可以在R2中找到,所以是保持函数依赖的。
(3)综上,答案选A。
当关系分解为2个以上的关系模式时,判断一个分解是不是无损分解算法理论参考教材P354,这里直接看例题(考的比较少)。
例2:设有关系模式R(ABCDEG),其函数依赖集为:F={E→D,C→B,CE→G,B→A},判断R的一个分解ρ={R1(AB),R2(BC),R3(ED),R4(EAG)}是否无损连接和保持函数依赖。
(1)无损连接判断:先根据题意将题中的属性和子模式矩阵化,如下表:
再根据F中的依赖关系修改表:E→D,E列有相同值 a 5 a_5 a5,D列 b 44 b_{44} b44改为 a 4 a_4 a4,C→B,C列无相同值,C列不做修改,CE→G,CE列无相同值,G列不做修改,B→A,B列有相同值 a 2 a_2 a2,将A列 b 21 b_{21} b21改为 a 1 a_1 a1。
重新再次遍历关系,该表值没有变化,观察表无一行数据全为a值,故为有损连接。
(2)保持函数依赖判断:E→D,C→B,B→A可以在R1(AB),R2(BC),R3(ED)中找到,CE→G不能在R4(EAG)找到,故不保持函数依赖。
说明:
1.疏忽、遗漏、错误之处,欢迎留言批评指正。
2.第7章下部分总结完毕,后续会继续完善补充本章的历年真题,转载请注明出处,整理不易,谢谢!