关系模式是一个五元组: R(U, D, DOM, F),
R是符号化的元组语义,U为一组属性,D为属性组U中的属性所来自的域,DOM为属性到域的映射,F为属性组U上的一组数据依赖。
D、DOM与模式设计关系不大,只用到三元组:R。
数据依赖是一个关系内部属性与属性之间的一种约束关系,主要类型:
函数依赖(Functional Dependency,简记为FD)
多值依赖(Multi-Valued Dependency,简记为MVD)
1.函数依赖【定义】设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在:两个元组在X上的属性值相等,而在Y上的属性值不等,则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。X称为这个函数依赖的决定因素。
若X→Y,并且Y→X, 则记为X←→Y。
若Y不函数依赖于X, 则记为X ↛ \nrightarrow ↛Y。
2.平凡函数依赖与非平凡函数依赖
X→Y,但Y⊈X则称X→Y是非平凡的函数依赖。
X→Y,但Y⊆X 则称X→Y是平凡的函数依赖。
平凡函数依赖必然成立,不反映新的语义,若不特别声明,总讨论非平凡函数依赖。
3.完全函数依赖与部分函数依赖
【定义】在R(U)中,如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ \nrightarrow ↛Y, 则称Y对X完全函数依赖.F
若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖.P
4.传递函数依赖【定义】在R(U)中,如果X→Y(Y⊈X),Y ↛ \nrightarrow ↛X,Y→Z,Z⊈Y, 则称Z对X传递函数依赖(transitive functional dependency)。记为:X → Z。
注: 如果Y→X, 即X←→Y,则Z直接依赖于X,而不是传递函数依赖。
多值依赖【定义】 设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
若X→→Y,而Z=Ф,则称X→→Y为平凡的多值依赖,否则称X→→Y为非平凡的多值依赖。
设K为R中的属性或属性组合。若K → U,则K称为R的一个候选码(Candidate Key)。
如果U部分函数依赖于K,即K → U,则K称为超码 。候选码是最小的超码,即K的任意真子集都不是候选码。
若关系模式R有多个候选码,则选定其中的一个做为主码(Primary key)。
关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码。
主码与外码一起提供了表示关系间联系的手段。
包含在任何一个候选码中的属性 ,称为主属性。
不包含在任何码中的属性称为非主属性。
整个属性组是码,称为全码(All-key)。
范式是符合某一种级别的关系模式的集合。
某一关系模式R为第n范式,可简记为R∈nNF。
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化。
1NF:二维表每个分量必须是不可分开的数据项,满足了这个条件的关系模式就属于第一范式。
【定义】 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R∈2NF。
一个关系模式不属于2NF,会产生插入异常,删除异常,修改复杂。出现这种问题的原因:有两类非主属性,一类对码完全函数依赖,另一类对码不是完全函数依赖。解决方法:用投影分解把关系模式分解,使得非主属性对码都是完全函数依赖了。
【定义】 设关系模式R∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Y ⊈ \nsubseteq ⊈ Z), 使得X→Y,Y→Z,Y ↛ \nrightarrow ↛X成立,则称R ∈ 3NF。
没有传递依赖
S-L中Sno →Sdept( Sdept ↛ \nrightarrow ↛Sno), Sdept→Sloc,可得Sno → Sloc。
解决的办法是将S-L分解成S-D(Sno,Sdept)∈ 3NF,D-L(Sdept,Sloc)∈ 3NF
通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
【定义】 设关系模式R∈1NF,若X →Y且Y ⊈ \nsubseteq ⊈X时X必含有码,则R∈BCNF。
换言之,在关系模式R中,如果每一个决定因素都含码,则R∈BCNF。
【定义】 关系模式R∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R∈4NF。
如果一个关系模式是4NF, 则必为BCNF。
4NF所允许的非平凡多值依赖是函数依赖。
不能说规范化程度越高的关系模式就越好。必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。上面的规范化步骤可以在其中任何一步终止。
闭包(记作X + ^{+} + )是由X直接或间接推导出的所有属性的集合。
对于给定的关系R(A1,A2,…An)和函数依赖集F,可将其属性分为4类:
L类:仅出现在函数依赖左部的属性。
R 类:仅出现在函数依赖右部的属性。
N 类:在函数依赖左右两边均未出现的属性。
LR类:在函数依赖左右两边均出现的属性。
定理:对于给定的关系模式R及其函数依赖集F,若X(X∈R):
是L类属性,则X必为R的任一候选码的成员;
是L类属性,且X+包含了R的全部属性,则X必为R的唯一候选码;
是R类属性,则X不在任何候选码中;
是N类属性,则X必包含在R的任一候选码中;
是L类和N类组成的属性集,且X+包含了R的全部属性,则X是R的唯一候选码。
【注】
AB→D 等价于 (A,B)→ D
D→BF 等价于 D→B, D→F
学生:学号、姓名、出生年月、系名、班号、宿舍区
班级:班号、专业名、系名、班级人数、入校年份
系:系名、系号、系办公室地点、系人数
学会:学会名、成立年份、地点、学会人数
一个系有若干专业(设无相同专业名在不同系):专业名 → \rightarrow →系名
每个专业每年只招一个班(设班号不同):(专业名,入校年份) ← → \leftarrow\rightarrow ←→班号
每个班若干学生(设学生只能属于一个班):学号 → \rightarrow →班号
一个系的学生住同一宿舍:系名 → \rightarrow →宿舍区
学生参加某学会有一个入会年份:(学号,学会名) → \rightarrow →入会年份
关系模式:
学生(学号、姓名、出生年月、班号)
候选码:学号。外部码:班号。
班级(班号、专业名、班级人数、入校年份)
候选码:班号、(专业名,入校年份)。
专业(专业名,系名)
候选码:专业名。外部码:系名。
系(系名、系号、系办公室地点、系人数,宿舍区)
候选码:系号、系名。
学会(学会名、成立年份、地点、学会人数)
候选码:学会名。
学生参加学会(学号,学会名,入会年份)
候选码:(学号,学会名)。
不存在传递函数依赖、部分函数依赖。
6、
(1)
A → \rightarrow →BCDE, BCDE ⊈ \nsubseteq ⊈A, A是码;
BC → \rightarrow →DE, DE ⊈ \nsubseteq ⊈BC, BC必含有码.
BC含有码时是BCNF。
(2)
L:C,E,C,E必为任一候选码的成员。LR:A,B,D。
(ACE) + ^{+} +=ABCDE; (BCE) + ^{+} +=ABCDE; (CDE) + ^{+} +=ABCDE.
码:ACE, BCE, CDE.
(3)
不存在非主属性,属于3NF.
A, BC, DE不含码,不属于BCNF。
7、
(1)正确:二目关系不存在码X、属性组Y及非主属性Z,属于3NF。
(2)正确
(3)正确:二目关系不存在多值依赖,属于4NF。
(4)正确 错误:当且仅当错,反之不然。
(5)正确
(6)正确
(7)正确
(8)错误:例:SC.(Sno,Cno) → \rightarrow →SC.Grade, SC.Sno ↛ \nrightarrow ↛SC.Grade,SC.Cno ↛ \nrightarrow ↛ SC.Grade.
8、
(1)若R是BCNF,X →Y且Y ⊈ \nsubseteq ⊈X时X必含有码,每一个决定因素都含码。
R中不存在这样的码X、属性组Y及非主属性Z(Y ⊈ \nsubseteq ⊈ Z), 使得X→Y,Y→Z,Y ↛ \nrightarrow ↛X成立。因为每一个决定因素都含码,Y含码,Y → \rightarrow →X成立,是3NF。
(2)若R不属于2NF,R中有非主属性部分函数依赖于任一个候选码,
则存在X→Y(Y⊈X),Y ↛ \nrightarrow ↛X,Y→Z,Z⊈Y, 不属于3NF。
附加题:
一.
Y(X1,X2,X3,X4)
(X1,X2)→X3
X2→X4
侯选码?属于第几范式?
解:
因为X2→X4,所以(X1,X2)→X4;又因为(X1,X2)→X3,所以(X1,X2)→(X1,X2,X3,X4)。因此:候选码:(X1,X2);
非主属性:X3,X4。因为(X1,X2)→X4, X2→X4,存在非主属性X4对候选码(X1,X2)的部分函数依赖;所以不属于2NF。
结论:候选码(X1,X2),属于第一范式。
二.
R(A,B,C,D)
F={AB→D,AC→BD,B→C}
侯选码?最高属于第几范式?
解:
考察F发现,A属性是L类属性,所以A必是R的候选码成员;
D属性是R类属性,则D不在任何候选码中;
因为(AB) + ^{+} +=ABCD,所以AB是R的候选码;
因为(AC) + ^{+} +=ABCD,所以AC是R的候选码;
非主属性:D,不存在非主属性D对候选码的部分函数依赖,所以属于2NF;
B →C且C ⊈ \nsubseteq ⊈B,B不含码,不属于BCNF。
答案:
候选码:(A,B),(A,C)
非主属性:D
属于3NF 因为D没有部分依赖或传递依赖于码
不属于BCNF 因为B→C,B不包含码
三.
R(X,Y,Z,W)
F={Y←→W,XY→Z}
侯选码?最高属于第几范式?
解:
考察F发现,X属性是L类属性,所以X必是R的候选码成员;
Z属性是R类属性,则Z不在任何候选码中;
因为(XY) + ^{+} +=XYZW,所以XY是R的候选码;
因为(XW) + ^{+} +=XYZW,所以XW是R的候选码;
非主属性:Z,不存在非主属性Z对候选码的部分函数依赖,所以属于2NF;
Y →W且W ⊈ \nsubseteq ⊈Y,Y不含码,不属于BCNF。
答案:
XY→X,XY→Y,XY→Z,Y→W,XY→W 所以 XY是key
WX→X,WX→W, W→Y,XW→XY,XY→Z,XW→Z,WX→W,W→Y,WX→Y 所以WX是key
是2NF,因为Z完全依赖于码(非主属性只有Z)
是3NF,因为Z没有传递依赖于码
不是BCNF W→Y,决定者不包含key
所以最高为3NF
四.
R(A,B,C,D,E)
F={A→B,CE→A,E→D}
候选码?最高属于第几范式,为什么?分解到3NF。
解:
C,E属性是L类属性, (CE) + ^{+} +=ABCDE,CE为R的唯一候选码。
非主属性:A,B,D,存在非主属性D对候选码CE的部分函数依赖E→D,所以不属于2NF。最高属于第一范式。
分解成R1(A,B,A→B),R2(E,D,E→D),R3(A,C,E,CE→A)。
答案:
1 候选码:(C,E)
2 最高属于1NF
CE→E,CE→D,E→D 非主属性E对CE存在部分函数依赖
3 首先分解到2NF
R1(A,B,C,E),R2(D,E)
因为 CE→A,A∕→CE,A→B ,存在非码对码的传递函数依赖
所以不属于3NF
分解为:R1(A,C,E),R2(A,B),R3(D,E)
五.
R(商店编号,商品编号,数量,部门编号,负责人)
每个商店的每种商品只在一个部门销售,
每个商店的每个部门只有一个负责人,
每个商店的每种商品只有一个库存数量。
求候选码。 R已达第几范式?为什么? 若不属于3NF,分解成3NF。
解:
(商店编号,商品编号) → \rightarrow →部门编号;
(商店编号,部门编号) → \rightarrow →负责人;
(商店编号,商品编号) → \rightarrow →数量;
L类属性:商店编号,商品编号; (商店编号,商品编号) + ^{+} +=(商店编号,商品编号,数量,部门编号,负责人);(商店编号,商品编号)为R的唯一候选码。
非主属性:数量,部门编号,负责人。不存在非主属性对候选码的部分函数依赖,属于2NF。
X(商店编号,商品编号)、Y(商店编号,部门编号)、Z(负责人),R中存在这样的码X、属性组Y及非主属性Z(Y ⊈ \nsubseteq ⊈ Z), 使得X→Y,Y→Z成立,Y ↛ \nrightarrow ↛X,不属于3NF。
分解:R1(商店编号,商品编号,数量,部门编号,(商店编号,商品编号) → \rightarrow →部门编号,(商店编号,商品编号) → \rightarrow →数量),
R2(商店编号,部门编号,负责人,(商店编号,部门编号) → \rightarrow →负责人)
答案:
1 候选码:(商店编号,商品编号)
2 R已达2NF
负责人(非码)对码存在传递函数依赖
(商店编号,商品编号)→(商店编号,部门编号)
(商店编号,部门编号) →负责人
3 分解成3NF
R1(商店编号,商品编号,数量,部门编号)
R2(商店编号,部门编号,负责人)
六.
R(A,B,C,D,E,F) F={A→C,AB→D,C→E,D→BF}
写出关键字。 分解到2NF。 分解到3NF。 分解到4NF。
解:
L类属性A是R的候选码成员,(A) + ^{+} +=ACE;R类属性E,F不在任何候选码中;
因为(AB) + ^{+} +=ABCDEF,所以AB是R的候选码;
因为(AD) + ^{+} +=ABCDEF,所以AD是R的候选码;
非主属性:C,E,F,
存在非主属性C对候选码的部分函数依赖A→C,
存在非主属性F对候选码的部分函数依赖D→F,
不属于2NF;
分解到2NF:R1(A,C,E,A→C,C→E),R2(D,F,D→F),R3(A,B,D,AB→D,D→B).
分解到3NF:R1(A,C,A→C),R4(C,E,C→E),R2(D,F,D→F),R3(A,B,D).
分解到4NF:R1(A,C,A→C),R4(C,E,C→E),R2(D,F,D→F),R3(A,B,D) .
答案:
1 关键字:(A,B),(A,D)
2 分解到2NF
AB→A,A→C 所以 AB→C,A→C 部分函数依赖
AD→F,D→F也是部分函数依赖
因此,分解为:R1(A,B,D),R2(A,C,E),R3(D,F)
------------------E由C确定,所以放到R2
3 A→C,C\→A,C→E 传递依赖
分为 (A,C),(C,E)
因此R1(A,B,D),R2(A,C),R3(C,E),R4(D,F)
4 D→B,D不包含码
R1 分解成 (A,D),(D,B)
因此 R1(A,B),R2(B,D),R3(A,C),R4(C,E),R5(D,F)