关系模式:五元组R(U, D, DOM, F),本章中把关系模式看作一个三元组:R
关系要满足的条件:每个分量必须是不可分开的数据项。
满足这个条件的关系模式:第一范式(1NF),之前我们涉及到的表基本都是第一范式。
数据依赖:关系内部属性与属性之间的一种约束关系;
类型:函数依赖(FD);多值依赖(MVD);
关系模式中存在一些问题:数据冗余、更新异常、插入异常、删除异常。这是由存在于模式中的某些数据依赖引起的。但是用规范化理论改造关系模式可以消除其中不合适的数据依赖。
1、函数依赖
(1)定义:设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,
记作X → \rightarrow →Y。
(2)平凡函数依赖:X → \rightarrow →Y,但Y ⊈ \nsubseteq ⊈X,则X → \rightarrow →Y是非平凡的函数依赖。(不反映新的语义)
非平凡函数依赖X → \rightarrow →Y,但Y ⊆ \subseteq ⊆X 则X → \rightarrow →Y是平凡的函数依赖。
若X → \rightarrow →Y,则X称为这个函数依赖的决定因素。
若X → \rightarrow →Y,Y → \rightarrow →X,则记作X ← \leftarrow ← → \rightarrow →Y。
若Y不函数依赖于X,则记作X ↛ \nrightarrow ↛ Y
(3)完全函数依赖:在R(U)中,如果X → \rightarrow →Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ \nrightarrow ↛ Y, 则称Y对X完全函数依赖。
部分函数依赖:若X → \rightarrow →Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖
(4)传递函数依赖:在R(U)中,如果X → \rightarrow →Y(Y ⊈ \nsubseteq ⊈X),Y ↛ \nrightarrow ↛ X,Y → \rightarrow →Z,Z ⊈ \nsubseteq ⊈Y, 则称Z对X传递函数依赖。(如果Y → \rightarrow →X, 即X ← \leftarrow ← → \rightarrow →Y,则Z直接依赖于X,而不是传递函数依赖)
2、码
(1)候选码(码):设K为R中的属性或属性组合。若U对K完全函数依赖,则K称为R的一个候选码。
(2)超码 :如果U部分函数依赖于K,即K → \rightarrow →U,则K称为超码。(候选码是最小的超码)
(3)主码:若关系模式R有多个候选码,则选定其中的一个做为主码。
(4)主属性与非主属性:包含在任何一个候选码中的属性 ,称为主属性;不包含在任何码中的属性称为非主属性。
(5)全码:整个属性组是码,称为全码。
(6)外码:关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外码。
3、范式
(1)定义:符合某一种级别的关系模式的集合。
(2)种类:第一范式(1NF);第二范式(2NF);第三范式(3NF);BC范式(BCNF);第四范式(4NF);第五范式(5NF)。
(3)联系:1NF ⊃ \supset ⊃ 2NF ⊃ \supset ⊃ 3NF ⊃ \supset ⊃ BCNF ⊃ \supset ⊃ 4NF ⊃ \supset ⊃ 5NF.
(4)规范化:一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合的过程叫规范化。
4、2NF
(1)定义:若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R ∈ \in ∈ 2NF。
(2)不属于2NF的关系模式,可能会产生以下问题:插入异常,删除异常,修改复杂。
出现问题的原因:非完全依赖关系。
解决方式:用投影分解把关系模式S-L-C分解成两个关系模式。(将不完全依赖关系的属性拿出来)
5、3NF
(1)定义:设关系模式R ∈ \in ∈ 1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Z ⊇ \supseteq ⊇ Y), 使得X → \rightarrow →Y,Y → \rightarrow →Z成立,Y ↛ \nrightarrow ↛ X不成立,则称R ∈ \in ∈ 3NF。
(2)将关系模式分解成3NF:将传递依赖分开。例如:S-L中Sno → \rightarrow →Sdept( Sdept ↛ Sno), Sdept → \rightarrow →Sloc,Sno和Sloc是传递关系。解决的办法是将S-L分解成:S-D(Sno,Sdept) ∈ \in ∈ 3NF,D-L(Sdept,Sloc) ∈ \in ∈ 3NF。
6、BCNF
定义:设关系模式R ∈ \in ∈ 1NF,若X → \rightarrow →Y且Y ⊆ X时X必含有码,则R ∈ \in ∈ BCNF。
换言之,在关系模式R中,如果每一个决定属性集都包含候选码,则R ∈ \in ∈ BCNF。
7、多值依赖
(1)定义:设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X → \rightarrow → → \rightarrow →Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
(2)平凡多值依赖:若X → \rightarrow → → \rightarrow →Y,而Z=Ф,则称X → \rightarrow → → \rightarrow → Y为平凡的多值依赖
非平凡的多值依赖:否则称X → \rightarrow → → \rightarrow →Y为非平凡的多值依赖。
8、4NF
(1)定义:关系模式R∈1NF,如果对于R的每个非平凡多值依赖X → \rightarrow → → \rightarrow →Y(Y ⊈ X),X都含有码,则R ∈ \in ∈ 4NF。
9、小结:1NF → \rightarrow → 2NF:消除非主属性对码的部分函数依赖;
2NF → \rightarrow → 3NF:消除非主属性对码的传递函数依赖;
3NF → \rightarrow → BCNF:消除主属性对码的部分和传递函数依赖;
BCNF → \rightarrow → 4NF:消除非平凡且非函数依赖的多值依赖;
关系模式:
学生(学号,姓名,出生年月,系名,班号,宿舍区);
班级(班号,专业号,系名,人数,入校年份);
系(系名,系号,系办公室地点,人数);
学会(学会名,成立年份,地点,人数);
函数依赖有:专业名 → \rightarrow →系名,(班号,入校年份) ← \leftarrow ← → \rightarrow →专业号,学号 → \rightarrow →班号。系名 → \rightarrow →宿舍区。(学号,学会名) → \rightarrow →入会年份。
在学生关系中,由学号属性可以确定其他属性,所以学号属性是候选码,学号 → \rightarrow →系名,又因为函数依赖 系名 → \rightarrow →宿舍区,而且他们都是平凡函数依赖,所以存在传递函数依赖学号 → \rightarrow →宿舍区。
在班级关系中,(班号,入校年份) → \rightarrow →专业号,专业名 → \rightarrow →系名,所以存在传递函数依赖 (班号,入校年份) → \rightarrow →系名。
在系关系中,没有传递函数依赖关系。
在学会关系中,没有传递函数依赖关系。
(班号,入校年份) ← \leftarrow ← → \rightarrow →专业号中,是完全依赖关系,班号和入校年份不能单独不能确定专业号;(学号,学会名) → \rightarrow →入会年份,也是完全依赖关系。
学生关系中,候选码是学号,外码是系名,班号,不存在全码。
班级关系中,候选码是(班号,入校年份),外码是系名,不存在全码。
系关系中,候选码是系号,系名。没有外码,不存在全码。
学会关系中,候选码是学会名,没有外码,不存在全码。
(2)依赖关系右部是B,D,A,所以码一定包括C,E,则码可以是(B,C,E),(A,C,E),(C,D,E).
(3)(B,C,E),(A,C,E),(C,D,E)中没有传递依赖,是3NF,决定因素中不含码,所以不是BCNF.
(2)正确;决定因素含码。
(3)正确;只有两个属性值一定满足平凡多值依赖。
(4)正确;
(5)正确;
(6)正确;
(7)正确;
(8)错误:(Sno,Cno) → \rightarrow →Grade,但是Sno ↛ \nrightarrow ↛ Grade,Cno ↛ \nrightarrow ↛Grade;学号和课程号确定成绩,但是学号不饿能单独确定成绩。
(1)R是BCNF关系模式,X → \rightarrow →Y,且Y ∉ \notin ∈/ 0,决定因素中必含码。
若X是码,则X → \rightarrow →Y,不会由Y → \rightarrow →Z成立,因为Y不是码。所以是3NF.
反之不存在X → \rightarrow →Y,时使Y → \rightarrow →Z成立,不能保证决定因素中必含码。
(2)假设R ∈ \in ∈ 3NF,但R ∉ \notin ∈/ 2NF,则存在非主属性不完全依赖于任何一个候选码,而是依赖于候选码的一个子集,而候选码依赖于候选码的子集,这样就有了一个传递依赖,就不是3NF了,所以假设不成立,R ∈ \in ∈ 2NF.
一.
Y(X1,X2,X3,X4)
(X1,X2)→X3
X2→X4
1. 侯选码?
(X1,X2)
2. 属于第几范式?
因为X2→X4,所以X4对(X1,X2)部分依赖。故是1NF。
二.
R(A,B,C,D)
F={AB→D,AC→BD,B→C}
1. 侯选码?
(A,C),(A,B);
2. 最高属于第几范式?
没有传递依赖是3NF,决定因素B → \rightarrow →C时不包含候选码,不是BCNF.
三.
R(X,Y,Z,W)
F={Y←→W,XY→Z}
1. 侯选码?
(X,Y);(X,W);
2. 最高属于第几范式?
可用候选码确定非主属性。无传递依赖,决定因素不含码。是3NF。
四.
R(A,B,C,D,E) F={A→B,CE→A,E→D}
1. 求候选码。
(C,E);
2. 最高属于第几范式,为什么?
1NF,非主属性D不完全依赖于(C,E),所以不是2NF.
3. 分解到3NF。
R1(A,B,C,E),R2(C,E,D);
五.
R(商店编号,商品编号,数量,部门编号,负责人)
每个商店的每种商品只在一个部门销售,
每个商店的每个部门只有一个负责人,
每个商店的每种商品只有一个库存数量。
(商店编号,商品编号) ← \leftarrow ← → \rightarrow →部门编号;
(商店编号,部门编号) ← \leftarrow ← → \rightarrow →负责人;
(商店编号,商品编号) ← \leftarrow ← → \rightarrow →数量;
1. 求候选码。
(商店编号,商品编号)
2. R已达第几范式?为什么?
第二范式。(商店编号,商品编号) → \rightarrow →商店编号,(商店编号,商品编号) → \rightarrow →部门编号;所以(商店编号,商品编号) → \rightarrow →(商店编号,部门编号),(商店编号,部门编号) → \rightarrow →负责人;所以有传递依赖,不是第三范式。部门编号,数量,负责人完全依赖于候选码,是第二范式。
3. 若不属于3NF,分解成3NF。
R1(商店编号,商品编号,数量,负责人);R2(商店编号,商品编号,部门编号);
六.(不会)
R(A,B,C,D,E,F) F={A→C,AB→D,C→E,D→BF}
1. 写出关键字。
候选码:(A,B),(A,D);
(A,B)时,C,E不能完全依赖。(A,D)时,C,B,E,F也不能完全依赖。
2. 分解到2NF。
要消除部份依赖,就要把C,E单独出来,C于A有依赖,所以将A,C,E拿出来。
R1(A,B,D,F),R2(A,C,E);F1={D→BF,AB→D}.F2={A→C,C→E};
3. 分解到3NF。
R1(A,B,D),R2(D,B,F),R3(A,C),R4(C,E);
4. 分解到4NF。
R1(A,B,D),R2(D,B,F),R3(A,C),R4(C,E);
参考:符号表示