关系数据理论
6.1 问题的提出
(1)关系数据库逻辑设计
针对具体问题,如何构造一个适合于它的数据模式
数据库逻辑设计的工具──关系数据库的规范化理论
(2)关系模式由五部分组成,是一个五元组: R(U, D, DOM, F)
6.1.1 问题的提出
关系名R是符号化的元组语义
U为一组属性
D为属性组U中的属性所来自的域
DOM为属性到域的映射
F为属性组U上的一组数据依赖
由于D、DOM与模式设计关系不大,因此在本章中把关系模式看作一个三元组:R
当且仅当U上的一个关系r满足F时,r称为关系模式R的一个关系
作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)
6.1.2 属性间的联系
(1)一对一联系
设X,Y为关系中的属性或属性组,它们的所有可能取值组成两个集合。如果对于X中的任一具体值Y中至多有一个值与之对应,称X,Y这两个属性之间是一对一联系。
例:在读者关系中,借书证号是唯一的,如果读者没有重名的,姓名与借书证号两个属性之间是1:1联系。姓名可以确定借书证号,借书证号也可以确定姓名。
(2)如果属性值集合X中的任一个具体值,至多与Y中的一个值相对应,而Y中的任一个具体值却可以和X中的多个值相对应,则称两个属性间从X到Y为m:1的联系或从Y到X是1:m的联系。
注意:这里指的是属性值个数的多少,而不是具有相同属性值的有多少个元组,二者正好相反。
例:在图书关系中,一本书有若干副本,它们有相同的书名、作者、分类号等,但每本书有唯一的总编号。书名与总编号之间是1:m,即同一个书名,有多个总编号与之对应。()
(3)多对多联系
在X,Y两个属性值集中,如果任一个值都可以至多和另一个属性值集中多个值对应,反之亦然,则称属性X和Y是m:n关系。
例:在借阅关系中,一个读者可以借多本书,即同一个借书证号有若干个图书总编号与之对应。由总编号标识的一本书在不同日期可以被不同的读者借阅。
(4)数据依赖
是一个关系内部属性与属性之间的一种约束关系
通过属性间值的相等与否体现出来的数据间相互联系
是现实世界属性间相互联系的抽象
是数据内在的性质
是语义的体现
(5)数据依赖的主要类型
函数依赖(Functional Dependency,简记为FD)
多值依赖(Multi-Valued Dependency,简记为MVD)
6.2 规范化
规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
6.2.1 函数依赖
1. 函数依赖
1.定义6.1 设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
2.函数依赖与属性间的联系类型有关
(1) 一对一联系:X←→Y
(2) 多对一联系:X→Y
(3) 多对多联系:不存在依赖关系
(4) 可从属性间的联系类型来分析属性间的函数依赖
说明:
1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立
3. 数据库设计者可以对现实世界作强制的规定。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在, 则拒绝装入该元组。
2. 平凡函数依赖与非平凡函数依赖
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
若X→Y,则X称为这个函数依赖的决定因素(Determinant)。
若X→Y,Y→X,则记作X←→Y。
若Y不函数依赖于X,则记作X↛Y。
3. 完全函数依赖与部分函数依赖
定义6.2 在R(U)中,如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖,记作X → Y。
若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X → Y
[例] 在关系SC(Sno, Cno, Grade)中,有:
由于:Sno ↛Grade,Cno ↛ Grade,
因此:(Sno, Cno) → Grade
(Sno,Cno)→Sdept是部分函数依赖
因为Sno →Sdept成立,且Sno是(Sno,Cno)的真子集
4. 传递函数依赖
定义6.3 在R(U)中,如果X→Y(Y⊈X),Y↛X,Y→Z,Z⊈Y, 则称Z对X传递函数依赖(transitive functional dependency)。记为:X → Z。
注: 如果Y→X, 即X←→Y,则Z直接依赖于X,而不是传递函数依赖。
[例] 在关系Std(Sno, Sdept, Mname)中,有:
Sno → Sdept,Sdept → Mname,
Mname传递函数依赖于Sno
找出职工工资表中的传递函数依赖
6.2.2 码
(1)定义6.4 设K为R中的属性或属性组合。若K → U,则K称为R的一个候选码(Candidate Key)。
如果U部分函数依赖于K,即K → U,则K称为超码 (Surpkey)。候选码是最小的超码,即K的任意一个真子集都不是候选码。
(2)若关系模式R有多个候选码,则选定其中的一个做为主码(Primary key)。
(3)主属性与非主属性
包含在任何一个候选码中的属性 ,称为主属性 (Prime attribute)
不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
(4)全码:整个属性组是码,称为全码(All-key)
[例6.2]S(Sno, Sdept, Sage),单个属性Sno是码
SC(Sno, Cno, Grade)中,(Sno, Cno)是码
[例6.3] R(P,W,A) P:演奏者 W:作品 A:听众
一个演奏者可以演奏多个作品
某一作品可被多个演奏者演奏
听众可以欣赏不同演奏者的不同作品
码为(P,W,A),即All-Key
(5)定义6.5 关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码。
SC(Sno,Cno,Grade)中,Sno不是码
Sno是 S(Sno,Sdept,Sage)的码,则Sno是SC的外码
(6)主码与外部码一起提供了表示关系间联系的手段
6.2.3 范式
(1)各种范式之间存在联系:
(2)某一关系模式R为第n范式,可简记为R∈nNF。
一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(normalization)。
6.2.4 2NF
(1)定义6.6 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R∈2NF
[例6.4] S-L-C(Sno,Sdept,Sloc,Cno,Grade), Sloc为学生的住处,并且每个系的学生住在同一个地方。S-L-C的码为(Sno,Cno)。
函数依赖有
(Sno,Cno)→Grade
Sno→Sdept, (Sno,Cno)→Sdept
Sno→Sloc, (Sno,Cno)→Sloc
Sdept→Sloc
S-L-C的码为(Sno, Cno)
S-L-C满足第一范式。
非主属性Sdept、Sloc并不完全依赖于码
关系模式S-L-C不属于2NF
(2)一个关系模式不属于2NF,会产生以下问题:
插入异常
如果插入一个新学生,但该生未选课,即该生无Cno,由于插入元组时,必须给定码值,因此插入失败。
删除异常
如果S4只选了一门课C3,现在他不再选这门课,则删除C3后,整个元组的其他信息也被删除了。
修改复杂
如果一个学生选了多门课,则Sdept,Sloc被存储了多次。如果该生转系,则需要修改所有相关的Sdept和Sloc,造成修改的复杂化
(3)出现这种问题的原因
例子中有两类非主属性:
一类如Grade,它对码完全函数依赖
另一类如Sdept、Sloc,它们对码不是完全函数依赖
(4)解决方法:
用投影分解把关系模式S-L-C分解成两个关系模式
SC(Sno,Cno,Grade)
S-L(Sno,Sdept,Sloc)
SC的码为(Sno,Cno),SL的码为Sno,这样使得非主属性对码都是完全函数依赖了
6.2.5 3NF
(1)定义6.7 设关系模式R∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Z ⊇ Y), 使得X→Y,Y→Z成立,Y ↛ X不成立,则称R ∈ 3NF。
SC没有传递依赖,因此SC ∈ 3NF
例:2NF关系模式S-L(Sno, Sdept, Sloc)中
函数依赖:
Sno→Sdept
Sdept → Sno
Sdept→Sloc
可得:
Sno→Sloc,即S-L中存在非主属性对码的传递函数依
赖,S-L ∈ 3NF
函数依赖图:
(2)不良特性
插入异常:如果系中没有学生,则有关系的信息就无法插入。
删除异常:如果学生全部毕业了,则在删除学生信息的同时有关系的信息也随之删除了。
更新异常:如果学生转系,不但要修改SDept,还要修改Sloc,如果换Sloc,则该系每个学生元组都要做相应修改。
数据冗余:每个学生都存储了所在系的Sloc的信息。
(3)解决方法
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D(Sno, Sdept)
D-L(Sdept,Sloc)
S-D的码为Sno, D-L的码为Sdept。
分解后的关系模式S-D与D-L中不再存在传递依赖
(4)说明
(1) 每个非主属性既不部分依赖,也不传递依赖于R的任何码。
(2) 从1NF→2NF:消除非主属性对码的部分函数依赖
(3) 从2NF→3NF:消除非主属性对码的传递函数依赖
(4) 从一个表中删去不依赖于主码的数据列。
6.2.6 BCNF
(1)BCNF(Boyce Codd Normal Form)由Boyce和Codd提出,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
(2)定义6.8 设关系模式R∈1NF,若X →Y且Y ⊆ X时X必含有码,则R∈BCNF。
(3)换言之,在关系模式R中,如果每一个决定属性集都包含候选码,则R∈BCNF。
(4)[例6.5]考察关系模式C(Cno,Cname,Pcno)
它只有一个码Cno,没有任何属性对Cno部分依赖或传递依赖,所以C∈3NF。
同时C中Cno是唯一的决定因素,所以C∈BCNF。
对于关系模式SC(Sno,Cno,Grade)可作同样分析。
(5)不良特性
插入异常:如果没有学生选修某位老师的任课,则该老师担任课程的信息就无法插入。
删除异常:删除学生选课信息,会删除掉老师的任课信息。
更新异常:如果老师所教授的课程有所改动,则所有选修该老师课程的学生元组都要做改动。
数据冗余:每位学生都存储了有关老师所教授的课程的信息。
(6)症由:
主属性对码的不良依赖。
(7)非BCNF的关系模式也可以通过分解成为BCNF。例如STJ可分解为ST(S,T)与TJ(T,J),它们都是BCNF。
没有任何属性对码的部分函数依赖和传递函数依赖
BCNF的关系模式所具有的性质
⒈ 所有非主属性都完全函数依赖于每个候选码
⒉ 所有主属性都完全函数依赖于每个不包含它的候选码
⒊ 没有任何属性完全函数依赖于非码的任何一组属性
6.2.7 多值依赖
例[6.9]设学校中某一门课程由多个教师讲授,他们
使用相同的一套参考书。每个教员可以讲授多门课
程,每种参考书可以供多门课程使用
用关系模式Teaching(C,T,B)来表示课程C、教师T和参
考书B之间的关系。
(1)定义6.9 设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
(2)例 Teaching(C, T, B)
对于C的每一个值,T有一组值与之对应,而不论
B取何值。因此T多值依赖于C,即C→→T。
(3)平凡多值依赖和非平凡的多值依赖
若X→→Y,而Z=Ф,即Z为空,则称X→→Y为平凡的多值依赖。
否则称X→→Y为非平凡的多值依赖
(4)找出关系上所满足的多值依赖。
A→→C
C→→A
[例6.10]关系模式WSC(W,S,C)中,W表示仓库,S 表示保管
员,C 表示商品。假设每个仓库有若干个保管员,有若干种
商品。每个保管员保管所在仓库的所有商品,每种商品被所
有保管员保管。
(5)按照语义对于W的每一个值Wi,S有一个完整的集合与之对应而不问C取何值。所以W→→S。
(6)对应W的某一个值Wi的全部S值记作{S}Wi(表示此仓库工作的全部保管员)
全部C值记作{C}Wi(表示在此仓库中存放的所有商品)
应当有{S}Wi中的每一个值和{C}Wi中的每一个C值对应
于是{S}Wi与{C}Wi之间正好形成一个完全二分图,因而W→→S。
(7)由于C与S的完全对称性,必然有W→→C成立。
(8)多值依赖的性质
(1)多值依赖具有对称性。
即若X→→Y,则X→→Z,其中Z=U-X-Y
多值依赖的对称性可以用完全二分图直观地表示出来。
从[例6.10] 容易看出,因为每个保管员保管所有商品,同时每种商品被所有保管员保管,显然若W→→S,必然有W→→C。
(2)多值依赖具有传递性。即若X→→Y,Y→→Z, 则 X→→Z -Y。
(3)函数依赖是多值依赖的特殊情况。即若X→Y,则
X→→Y。
(4)若X→→Y,X→→Z,则X→→YZ。
(5)若X→→Y,X→→Z,则X→→Y∩Z。
(6)若X→→Y,X→→Z,则X→→Y-Z,X→→Z -Y。
(9)多值依赖与函数依赖的区别
(1)多值依赖的有效性与属性集的范围有关
若X→→Y在U上成立,则在W(XY W U)上一定成立;反之则不然,即X→→Y在W(W U)上成立,在U上并不一定成立。
原因:多值依赖的定义中不仅涉及属性组X和Y,而且涉及U中其余属性Z。
多值依赖的有效性与属性集的范围有关(续)
一般地,在R(U)上若有X→→Y在W(W U)上成立,则称X→→Y为R(U)的嵌入型多值依赖。
函数依赖X→Y的有效性仅决定于X、Y这两个属性集的值
只要在R(U)的任何一个关系r中,元组在X和Y上的值满足定义6.l,则函数依赖X→Y在任何属性集W(XY W U)上成立。
(2)若函数依赖X→Y在R (U)上成立,则对于任何Y‘ Y均有X→Y’ 成立。多值依赖X→→Y若在R(U)上成立,不能断言对于任何Y’ Y有X→→Y’ 成立。
6.2.8 4NF
(1)定义6.10 关系模式R∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R∈4NF。
(2)不允许有非平凡且非函数依赖的多值依赖。
(3)允许的非平凡多值依赖实际上是函数依赖。
例: Teaching(C,T,B) ∈ 4NF
存在非平凡的多值依赖C→→T,且C不是码
如果一门课Ci有m个教员,n本参考书,则关系中分量为Ci的元组共有m×n个,数据冗余非常大。
用投影分解法把Teaching分解为如下两个关系模式:
CT(C, T) ∈ 4NF
CB(C, B) ∈ 4NF
C→→T, C→→B是平凡多值依赖
在分解后的关系中分量为Ci的元组共有m + n个。