第六章 关系数据理论
6.1 问题的提出
关系数据库逻辑设计
-
- 针对具体问题,如何构造一个适合于它的数据模式
- 数据库逻辑设计的工具──关系数据库的规范化理论
- 关系模式由五部分组成,是一个五元组:
R(U, D, DOM, F)- 关系名R是符号化的元组语义
- U为一组属性
- D为属性组U中的属性所来自的域
- DOM为属性到域的映射
- F为属性组U上的一组数据依赖
- 由于D、DOM与模式设计关系不大,因此在本章中把关系模式看作一个三元组:R<U,F>
- 当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系
- 作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)
- 一对一联系
- 设X,Y为关系中的属性或属性组,它们的所有可能取值组成两个集合。如果对于X中的任一具体值Y中至多有一个值与之对应,称X,Y这两个属性之间是一对一联系。
- 例:在读者关系中,借书证号是唯一的,如果读者没有重名的,姓名与借书证号两个属性之间是1:1联系。姓名可以确定借书证号,借书证号也可以确定姓名。
- 如果属性值集合X中的任一个具体值,至多与Y中的一个值相对应,而Y中的任一个具体值却可以和X中的多个值相对应,则称两个属性间从X到Y为m:1的联系或从Y到X是1:m的联系。
- 注意:这里指的是属性值个数的多少,而不是具有相同属性值的有多少个元组,二者正好相反。
- 例:在图书关系中,一本书有若干副本,它们有相同的书名、作者、分类号等,但每本书有唯一的总编号。书名与总编号之间是1:m,即同一个书名,有多个总编号与之对应。
- 在X,Y两个属性值集中,如果任一个值都可以至多和另一个属性值集中多个值对应,反之亦然,则称属性X和Y是m:n关系。
- 例:在借阅关系中,一个读者可以借多本书,即同一个借书证号有若干个图书总编号与之对应。由总编号标识的一本书在不同日期可以被不同的读者借阅。
- 数据依赖
- 是一个关系内部属性与属性之间的一种约束关系
- 通过属性间值的相等与否体现出来的数据间相互联系
- 是现实世界属性间相互联系的抽象
- 是数据内在的性质
- 是语义的体现
- 是一个关系内部属性与属性之间的一种约束关系
- 数据依赖的主要类型
- 函数依赖(Functional Dependency,简记为FD)
- 多值依赖(Multi-Valued Dependency,简记为MVD)
- 函数依赖普遍存在于现实生活中
- 描述一个学生关系,可以有学号、姓名、系名等属性。
- 一个学号只对应一个学生,一个学生只在一个系中学习
- “学号”值确定后,学生的姓名及所在系的值就被唯一确定。
- Sname=f(Sno),Sdept=f(Sno)
- 即Sno函数决定Sname
- Sno函数决定Sdept
- 记作Sno→Sname,Sno→Sdept
- 描述一个学生关系,可以有学号、姓名、系名等属性。
- [例6.1] 建立一个描述学校教务的数据库。
涉及的对象包括:- 学生的学号(Sno)
- 所在系(Sdept)
- 系主任姓名(Mname)
- 课程号(Cno)
- 成绩(Grade)
-
- 假设学校教务的数据库模式用一个单一的关系模式Student来表示,则该关系模式的属性集合为:
U ={Sno, Sdept, Mname, Cno, Grade}
-
- 现实世界的已知事实(语义):
- 一个系有若干学生, 但一个学生只属于一个系;
- 一个系只有一名(正职)负责人;
- 一个学生可以选修多门课程,每门课程有若干学生选修;
- 每个学生学习每一门课程有一个成绩。
- 由此可得到属性组U上的一组函数依赖F:
- 现实世界的已知事实(语义):
F={Sno→Sdept, Sdept→ Mname, (Sno, Cno)→ Grade}
关系模式Student<U, F>中存在的问题:
(1)数据冗余
-
- 浪费大量的存储空间
- 每一个系主任的姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。
- 浪费大量的存储空间
(2)更新异常(Update Anomalies)
-
- 数据冗余 ,更新数据时,维护数据完整性代价大。
- 某系更换系主任后,必须修改与该系学生有关的每一个元组。
- 数据冗余 ,更新数据时,维护数据完整性代价大。
(3)插入异常(Insertion Anomalies)
-
- 如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
(4)删除异常(Deletion Anomalies)
-
- 如果某个系的学生全部毕业了, 则在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
- 结论
- Student关系模式不是一个好的模式。
- 一个“好”的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽可能少。
- 原因
- 由存在于模式中的某些数据依赖引起的。
- 解决方法
- 用规范化理论改造关系模式来消除其中不合适的数据依赖
- 把这个单一的模式分成三个关系模式:
- S(Sno,Sdept,Sno → Sdept);
- SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
- DEPT(Sdept,Mname,Sdept → Mname);
- 这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。
- 问题:
- 插入异常:如果没有职工具有8级工资,则8级工资的工资数额就难以插入。
- 删除异常:如果仅有职工赵明具有4级工资,如果将赵明删除,则有关4级工资的工资数额信息也随之删除了。
- 数据冗余:职工很多,工资级别有限,每一级别的工资数额反复存储多次。
- 更新异常:如果将5级工资的工资数额调为1620,则需要找到每个具有5级工资的职工,逐一修改。
6.2 规范化
规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
6.2.1 函数依赖
1.函数依赖
2.平凡函数依赖与非平凡函数依赖
3.完全函数依赖与部分函数依赖
4.传递函数依赖
- 定义6.1 设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
- 函数依赖与属性间的联系类型有关
- (1) 一对一联系:X←→Y
- (2) 多对一联系:X→Y
- (3) 多对多联系:不存在依赖关系
(4) 可从属性间的联系类型来分析属性间的函数依赖
1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立
3. 数据库设计者可以对现实世界作强制的规定。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在, 则拒绝装入该元组。
- 由下面的关系表, 能否得出Sno → Sname
函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件
- 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。
- 在R(U)中,如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖,记作X → Y。
- 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X → Y
- 在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 码
- 设K为R<U,F>中的属性或属性组合。若K → U,则K称为R的一个候选码(Candidate Key)。
- 如果U部分函数依赖于K,即K → U,则K称为超码 (Surpkey)。候选码是最小的超码,即K的任意一个真子集都不是候选码。
- 若关系模式R有多个候选码,则选定其中的一个做为主码(Primary key)。
- 主属性与非主属性
- 包含在任何一个候选码中的属性 ,称为主属性 (Prime attribute)
- 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
- 全码:整个属性组是码,称为全码(All-key)
- 关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码。
- SC(Sno,Cno,Grade)中,Sno不是码
- Sno是 S(Sno,Sdept,Sage)的码,则Sno是SC的外码
主码与外部码一起提供了表示关系间联系的手段
关系模式S(S# , SN , SD , DEAN , C# , G)
主码:(S#,C#)
函数依赖:
(S#,C#) G
- ® SN,(S#,C#) SN
- ® SD,(S#,C#) SD
- ® DEAN, S# ® DEAN
(S#,C#) DEAN
6.2.3 范式
- 范式是符合某一种级别的关系模式的集合。
- 关系数据库中的关系必须满足一定的要求。满足 不同程度要求的为不同范式。
- 范式的种类:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- BC范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF)
- 各种范式之间存在联系:
- 某一关系模式R为第n范式,可简记为R∈nNF。
- 一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(normalization)。
6.2.4 2NF
- 定义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
-
- 一个关系模式不属于2NF,会产生以下问题:
- 插入异常
- 如果插入一个新学生,但该生未选课,即该生无Cno,由于插入元组时,必须给定码值,因此插入失败。
- 删除异常
- 如果S4只选了一门课C3,现在他不再选这门课,则删除C3后,整个元组的其他信息也被删除了。
- 修改复杂
- 如果一个学生选了多门课,则Sdept,Sloc被存储了多次。如果该生转系,则需要修改所有相关的Sdept和Sloc,造成修改的复杂化。
- 插入异常
- 出现这种问题的原因
- 例子中有两类非主属性:
- 一类如Grade,它对码完全函数依赖
- 另一类如Sdept、Sloc,它们对码不是完全函数依赖
- 例子中有两类非主属性:
- 解决方法:
- 用投影分解把关系模式S-L-C分解成两个关系模式
- SC(Sno,Cno,Grade)
- S-L(Sno,Sdept,Sloc)
- SC的码为(Sno,Cno),SL的码为Sno,这样使得非主属性对码都是完全函数依赖了
- 用投影分解把关系模式S-L-C分解成两个关系模式
6.2.5 3NF
- 设关系模式R<U,F>∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Z ⊇ Y), 使得X→Y,Y→Z成立,Y ↛ X不成立,则称R<U,F> ∈ 3NF。
SC没有传递依赖,因此SC ∈ 3NF
- 不良特性
- 插入异常:如果系中没有学生,则有关系的信息就无法插入。
- 删除异常:如果学生全部毕业了,则在删除学生信息的同时有关系的信息也随之删除了。
- 更新异常:如果学生转系,不但要修改SDept,还要修改Sloc,如果换Sloc,则该系每个学生元组都要做相应修改。
- 数据冗余:每个学生都存储了所在系的Sloc的信息。
- 解决方法
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D(Sno, Sdept)
D-L(Sdept,Sloc)
S-D的码为Sno, D-L的码为Sdept。
-
- 分解后的关系模式S-D与D-L中不再存在传递依赖
- 说明
(1) 每个非主属性既不部分依赖,也不传递依赖于R的任何码。
(2) 从1NF→2NF:消除非主属性对码的部分函数依赖
(3) 从2NF→3NF:消除非主属性对码的传递函数依赖
(4) 从一个表中删去不依赖于主码的数据列。
6.2.6 BCNF
- BCNF(Boyce Codd Normal Form)由Boyce和Codd提出,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
- 定义6.8 设关系模式R<U,F>∈1NF,若X →Y且Y ⊆ X时X必含有码,则R<U,F>∈BCNF。
- 换言之,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。
- 不良特性
- 插入异常:如果没有学生选修某位老师的任课,则该老师担任课程的信息就无法插入。
- 删除异常:删除学生选课信息,会删除掉老师的任课信息。
- 更新异常:如果老师所教授的课程有所改动,则所有选修该老师课程的学生元组都要做改动。
- 数据冗余:每位学生都存储了有关老师所教授的课程的信息。
- 症由:
主属性对码的不良依赖。
- 非BCNF的关系模式也可以通过分解成为BCNF。例如STJ可分解为ST(S,T)与TJ(T,J),它们都是BCNF。
- 没有任何属性对码的部分函数依赖和传递函数依赖
- 3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的测度。
- 一个模式中的关系模式如果都属于BCNF,那么在函数依赖范畴内,它已实现了彻底的分离,已消除了插入和删除的异常。
- 3NF的“不彻底”性表现在可能存在主属性对码的部分依赖和传递依赖。
- ⒈ 所有非主属性都完全函数依赖于每个候选码
- ⒉ 所有主属性都完全函数依赖于每个不包含它的候选码
- ⒊ 没有任何属性完全函数依赖于非码的任何一组属性
6.2.7 多值依赖
- Teaching具有唯一候选码(C,T,B), 即全码。
- Teaching∈BCNF
- 设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
- 例 Teaching(C, T, B)
对于C的每一个值,T有一组值与之对应,而不论
B取何值。因此T多值依赖于C,即C→→T。
- 多值依赖的另一个等价的定义
在R(U)的任一关系r中,如果存在元组t,s使得t[X]=s[X]
,那么就必然存在元组w,v∈r,(w,v可以与s,t相
同), 使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],
v[Y]=s[Y],v[Z]=t[Z](即交换s,t元组的Y值所得的两
个新元组必在r中则Y多值依赖于X,记为X→→Y。这里
X,Y是U的子集,Z=U-X-Y。
- 平凡多值依赖和非平凡的多值依赖
- 若X→→Y,而Z=Ф,即Z为空,则称X→→Y为平凡的多值依赖。
- 否则称X→→Y为非平凡的多值依赖。
- 找出关系上所满足的多值依赖。
- ®®C
- ®®A
- C®®B?若使B®®C成立,需加入哪些元组?
- 按照语义对于W的每一个值Wi,S有一个完整的集合与之对应而不问C取何值。所以W→→S。
- 如图6.7所示
- 对应W的某一个值Wi的全部S值记作{S}Wi(表示此仓库工作的全部保管员)
- 全部C值记作{C}Wi(表示在此仓库中存放的所有商品)
- 应当有{S}Wi中的每一个值和{C}Wi中的每一个C值对应
- 于是{S}Wi与{C}Wi之间正好形成一个完全二分图,因而W→→S。
- 由于C与S的完全对称性,必然有W→→C成立。
- 多值依赖的性质
(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。
- 多值依赖与函数依赖的区别
(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
- 关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R<U,F>∈4NF。
- 不允许有非平凡且非函数依赖的多值依赖。
- 允许的非平凡多值依赖实际上是函数依赖。
- 6.2.9 规范化小结
- 在关系数据库中,对关系模式的基本要求是满足第一范式。
- 规范化程度过低的关系不一定能够很好地描述现实世界
- 可能存在插入异常、删除异常、修改复杂、数据冗余等问题
解决方法就是对其进行规范化,转换成高级范式。
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化。
- 关系数据库的规范化理论是数据库逻辑设计的工具。
- 规范化的基本思想
- 是逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”。
- 即采用“一事一地”的模式设计原则
- 让一个关系描述一个概念、一个实体或者实体间的一种联系。
- 若多于一个概念就把它“分离”出去。
- 因此 规范化实质上是概念的单一化。
关系模式规范化的基本步骤
1NF
↓ 消除非主属性对码的部分函数依赖
消除决定因素 2NF
非码的非平凡 ↓ 消除非主属性对码的传递函数依赖
函数依赖 3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF
- 不能说规范化程度越高的关系模式就越好。
- 必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。
- 上面的规范化步骤可以在其中任何一步终止。
6.3 数据依赖的公理系统
- 定义6.11 对于满足一组函数依赖F的关系模式 R <U,F>,其任何一个关系r,若函数依赖X→Y都成立(即r中任意两元组t、s,若t[X]=s[X],则 t[Y]=s[Y]),则称F逻辑蕴涵X →Y。
- Armstrong公理系统
- 一套推理规则,是模式分解算法的理论基础
- 用途
- 求给定关系模式的码
- 从一组函数依赖求得蕴涵的函数依赖
- Armstrong公理系统 设U为属性集总体,F是U上的一组函数依赖, 于是有关系模式R <U,F >。对R <U,F> 来说有以下的推理规则:
- A1 自反律(reflexivity rule):若Y Í X Í U,则X →Y 为F所蕴涵。
- A2 增广律(augmentation rule):若X→Y为F所蕴涵,且Z Í U,则XZ→YZ 为F所蕴涵。
- A3 传递律(transitivity rule):若X→Y及Y→Z为F所蕴涵,则X→Z 为F所蕴涵。
注意:由自反律所得到的函数依赖均是平凡的函数依赖,
自反律的使用并不依赖于F。
- 根据A1,A2,A3这三条推理规则可以得到下面三条推理规则:
- 合并规则(union rule):
由X→Y,X→Z,有X→YZ。
-
- 伪传递规则(pseudo transitivity rule):
由X→Y,WY→Z,有XW→Z。
-
- 分解规则(decomposition rule):
- X→Y及ZÍY,有X→Z。
- 根据合并规则和分解规则,可得引理6.1
- 引理6.1 X→A1 A2…Ak成立的充分必要条件是X→Ai成立(i=1,2,…,k)。
- 定义6.12 在关系模式R<U,F>中为F所逻辑蕴涵的函数依赖的全体叫作F的闭包,记为F +。
- 定义6.13 设F为属性集U上的一组函数依赖,X、Y ÍU, XF+={ A|X→A能由F根据Armstrong公理导出},XF+称为属性集X关于函数依赖集F的闭包。
- 引理6.2 设F为属性集U上的一组函数依赖,X、Y Í U,X→Y能由F根据Armstrong公理导出的充分必要条件是Y ÍXF+。
- 引理6.2的用途
判定X→Y是否能由F根据Armstrong公理导出的问题,就
转化为求出XF+,判定Y是否为XF+的子集的问题。
- 求闭包的算法
- 算法6.1 求属性集X(X Í U)关于U上的函数依赖集F的闭包XF+
- 输入:X,F
- 输出:XF+
- 步骤:
- 令X(0)=X,i=0
- 求B,这里B ={ A |($ V)( $ W)(V→WÎF
- V Í X(i)AÎ W)}。
- X(i+1)=B∪X(i) 。
- 判断X(i+1)= X(i) 。
- 若X(i+1)与X(i)相等或X(i)=U ,则X(i)就是XF+,
算法终止。
- 若否,则i=i+1,返回第②步。
对于算法6.1, 令ai =|X(i)|,{ai }形成一个步长大于1的严格递增的序列,序列的上界是 | U |,因此该算法最多 |U| - |X| 次循环就
会终止。
-
- 由引理二,判定X®Y是否能由F根据Armstrong公理导出,可转化为求 ,判定YÍ 是否成立。
输入:X,F
输出:
1) := X;
- )考察每个F中的函数依赖 A®B,
- A Í ,则 := ÈB
3)继续考察,直到 不再增大为止。
- 函数依赖集的等价变换
- 例:r是关系模式R(A, B, C)上的一个关系,用SQL检测在r上是否满足函数依赖B ® C。
- 有效性与完备性的含义
- 有效性:由F 出发根据Armstrong公理推导出来的每一个函数依赖一定在F +中
- 完备性:F +中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来
- Armstrong公理的完备性及有效性说明:
- “导出”与“蕴涵”是两个完全等价的概念
- F+ :为F所逻辑蕴涵的函数依赖的全体(定义6.12 )
- F+ :可以说成由F出发借助Armstrong公理导出的函数依赖的集合
- 定义6.14 如果G+=F+,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。
- 引理6.3 F+ = G+ 的充分必要条件是F Í G+和GÍ F+ 。
- 要判定F Í G+,只须逐一对F中的函数依赖X→Y,考察 Y 是否属于XG++ 就行了。因此引理6.3 给出了判断两个函数依赖集等价的可行算法。
- 定义6.15 如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集,亦称为最小依赖集或最小覆盖。
(1)单属性化: F中任一函数依赖的右部仅含有一个属性。
(2)无冗余化: F中不存在这样的函数依赖X→A, 使得F与F-{X→A}等价。
(3)既约化: F中不存在这样的函数依赖X→A, X有真子集Z使得F-{X→A}∪{Z→A}与F等价。
- 定理6.3 每一个函数依赖集F均等价于一个极小函数依赖集Fm。此Fm称为F的最小依赖集。
- 证:构造性证明,分三步对F进行“极小化处理”,找出F的一个最小依赖集。
(1)逐一检查F中各函数依赖FDi:X→Y,
若Y=A1A2 …Ak,k≥2,
则用{X→Aj | j=1,2,…,k}来取代X→Y。
引理6.1保证了F变换前后的等价性。
(2)逐一检查F中各函数依赖FDi:X→A,
令G=F-{X→A},
- AÎXG+,则从F中去掉此函数依赖。
- F与G 等价的充要条件是AÎXG+
因此F变换前后是等价的。
(3)逐一取出F中各函数依赖FDi:X→A,
设X=B1B2…Bm,m≥2,
逐一考查Bi (i=1,2,…,m),
- A Î(X-Bi )F+,则以X-Bi 取代X。
由于F与F-{X→A}∪{Z→A}等价的充要条件是
- ÎZF+ ,其中Z=X-Bi ,因此F变换前后是等价的。
最后剩下的F就一定是极小依赖集。
因为对F的每一次“改造”都保证了改造前后的两个函数
依赖集等价,因此剩下的F与原来的F等价。
证毕
- 定理6.3的证明过程
- 是求F极小依赖集的过程
- 也是检验F是否为极小依赖集的一个算法
若改造后的F与原来的F相同,说明F就是一个最小依赖集
- F的最小依赖集Fm不一定是唯一的,它与对各函数依赖FDi 及X→A中X各属性的处置顺序有关。
- F = {A®B,B®A,A®C,B®C},求Fm。
- 检查A®B,G=F-{A®B}={B®A,A®C,B®C}
- ,C},BÏ{A,C}
-
- 检查A®C,G=F-{A®C}={A®B,B®A,B®C}
- ,B,C},CÎ{A,B,C}
- F中删除A®C,
- m = {A®B,B®A,B®C}
- Fm= {A®B,B®A,A®C}
- = {C®A,A®G,CG®B,B®A},求m。
F是无冗余的。
- CG®B,
- = = {G}
- Ï
-
- = = {C,A,G,B}
- Î ,以C代替CG
- Fm = {C®A,A®G,C®B,B®A}
- 在R<U,F>中可以用与F等价的依赖集G来取代F
- 原因:两个关系模式R1 <U,F>,R2<U,G>,如果F与G等价,那么R1的关系一定是R2的关系。反过来,R2的关系也一定是R1的关系。
、
- 把低一级的关系模式分解为若干个高一级的关系模式的方法不是唯一的
- 只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义
- 三种模式分解等价的定义:
- *6.4 模式的分解
⒈ 分解具有无损连接性
⒉ 分解要保持函数依赖
⒊ 分解既要保持函数依赖,又要具有无损连接性
关系模式R<U,F>的一个分解:
ρ={ R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>}
- ∪Ui,且不存在 Ui Í Uj,Fi 为 F在 Ui 上的投影
- 6.17 函数依赖集合{X→Y | X→Y Î F+∧XY ÍUi} 的一个覆盖 Fi 叫作 F 在属性 Ui 上的投影
- R<U , F> , U = (A , B , C) , F = {A®B , B®C}可以有分解:
- , Æ > , R2<B , Æ > , R3<C , Æ >}
- , B},{A®B}> , R2<{A , C},{A®C}>}
- 关系模式R<U,F>的一个分解 ρ={ R1<U1,F1>,R2<U2,F2>, …,Rn<Un,Fn>}
若R与R1、R2、…、Rn自然连接的结果相等,则称关系模式R的这个分解ρ具有无损连接性(Lossless join)
- 具有无损连接性的分解保证不丢失信息
- 无损连接性不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题
将SL分解为下面二个关系模式:
ND(Sno, Sdept)
NL(Sno, Sloc)
第3种分解方法具有无损连接性
问题:这种分解方法没有保持原关系中的函数依赖
-
- SL中的函数依赖Sdept→Sloc没有投影到关系模式ND、NL上
- 设关系模式R<U,F>被分解为若干个关系模式
- R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>
- (其中U=U1∪U2∪…∪Un,且不存在Ui Í Uj,Fi为F在Ui上的投影),若F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖Fi所逻辑蕴含,则称关系模式R的这个分解是保持函数依赖的(Preserve dependency)
- . 将SL分解为下面二个关系模式:
- ND(Sno, Sdept)
- DL(Sdept, Sloc)
- 这种分解方法就保持了函数依赖
- 如果一个分解具有无损连接性,则它能够保证不丢失信息
- 如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况
- 分解具有无损连接性和分解保持函数依赖是两个互相独立的标准。具有无损连接性的分解不一定能够保持函数依赖;同样,保持函数依赖的分解也不一定具有无损连接性。
- 将SL分解为下面二个关系模式:
- ND(Sno, Sdept)
- DL(Sdept, Sloc)
- 这种分解方法就保持了函数依赖
- 第1种分解方法既不具有无损连接性,也未保持函数依赖,它不是原关系模式的一个等价分解
- 第2种分解方法未保持了函数依赖,不具有无损连接性
- 第3种分解方法具有无损连接性,但未保持函数依赖
- 第4种分解方法既具有无损连接性,又保持了函数依赖
- 算法6.2 判别一个分解的无损连接性
- 算法6.3(合成法)转换为3NF的保持函数依赖的分解。
- 算法6.4 转换为3NF既有无损连接性又保持函数依赖的分解
- 算法6.5 (分解法)转换为BCNF的无损连接分解
- 算法6.6 达到4NF的具有无损连接性的分解
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF。
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF。
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF。
- 定理
- U1ÇU2 ® U1(或U2),则r =∏U1(r) ∏U2(r) 。
-
- 一般定义
关系模式R<U , F> ,U = Ui ,
- = {R1<U1 , F1> , R2<U2 , F2>, … , Rn<Un , Fn>}是R<U , F>的一个分解,r是R<U , F>的一个关系。
- mr(r) = ∏Ri(r) ,若对于R<U , F>的任一个关系r,都有r = mr (r),则称r是R<U , F>的一个无损连接分解。
- 算法:(判别一个分解的无损连接性)
U={A1, A2, … , An}
- = {R1<U1 , F1> , R2<U2 , F2>, … , Rk<Uk , Fk>}
⒈建立一个n列k行的矩阵
- = {Cij | 若Aj Î Ui , Cij = aj , 否则Cij = bij}
- F中每一个函数依赖X®Y,若TB中存在元组 t1,t2,使得t1[X]=t2[X],t1[Y]≠t2[Y],则每一个Ai Î Y:
①若t1[Ai],t2[Ai]中有一个等于aj,则另一个也
改为aj ;
②若①不成立,则全部改为bmj,m是这些行的行号最小值。
反复执行⒉,直至:
①TB中出现一行为a1, a2 , … , an 的一行。
② TB不再发生变化,且没有一行为a1, … , an。
- ①情况下, r为无损分解,否则为有损分解
- 算法:(达到BCNF无损连接分解算法)
给定关系模式R<U , F> ,
- 令r = {R<U , F>}
- 检查r中各关系模式是否属于BCNF,若是,则 算法终止。
- 设r 中Ri<Ui , Fi>不属于BCNF,
- X®AÎ ,且X不是Ri的码,
- XA是Ri的真子集,将Ri分解为s={S1,S2},
- US1 = XA, US2 = Ui - {A}
- s代替Ri ,返回到⒉
- 算法:(达到4NF无损连接分解算法)
给定关系模式R<U , F> ,
- 令r = {R<U , F>}
- 检查r中各关系模式是否属于4NF,若是,则算法终止。
- 设r 中Ri<Ui , Fi>不属于4NF,
- X®®A,X不是Ri的码,
- XA是Ri的真子集,将Ri分解为s={S1,S2},
- US1 = XA, US2 = Ui - {A}
- s代替Ri ,返回到⒉
- 保持函数依赖的分解
- 定义
- F+ = ( È Fi)+, 则称R< U , F >的分解
- = {R1<U1 , F1> , … , Rn<Un , Fn>}保持函数依赖。
如表(职工,级别,工资)的分解,
分解一:(职工,工资),(工资,级别)
- ®级别
分解二:(职工,级别),(工资,级别)
保持函数依赖。
-
- 结论:若要求分解保持函数依赖,那么分解后的模式总可以达到3NF,但不一定能达到BCNF。
- 算法:(达到3NF且保持函数依赖的分解)
⒈求F的极小函数依赖集Fm 。
⒉找出不在Fm中出现的属性,将它们构成一个关 系模式,并从U中去掉它们(剩余属性仍记为U)。
- 若有X®AÎ Fm ,且XA=U,
则={R},算法终止。
- Fm按具有相同左部的原则进行分组(设为k组),每一组函数依赖所涉及的属性全体为Ui,若Ui Í Uj就去掉Ui。令Fi为Fm在Ui上的投影,则r = {R1<U1 , F1> , … , Rk<Uk , Fk>}是R<U , F>的一个保持函数依赖的分解,并且每个Ri<Ui , Fi> Î3NF。
- 算法:(达到3NF且同时保持无损连接与函数依赖的分解)
- r = {R1<U1 , F1> , … ,Rk<Uk , Fk>}是R<U , F>的一个保持函数依赖的3NF分解。
设X为R<U , F>的码,
- Ui,X Í Ui,则r即为所求,
- τ = r∪{R* <X,FX>},τ即为所求。
- 示例:
- R(ABC;A®C,B®C)的保持无损连接和函数依赖的3NF分解。
⒈按保持函数依赖分解
- r={{AC;A®C},{BC;B®C}}。
⒉码为AB
- = r∪{AB}
最后的分解为:
- ;A®C},{BC;B®C},{AB}}
小结
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF
- 规范化理论为数据库设计提供了理论的指南和工具
-
第六章 关系数据理论
6.1 问题的提出
关系数据库逻辑设计
-
- 针对具体问题,如何构造一个适合于它的数据模式
- 数据库逻辑设计的工具──关系数据库的规范化理论
- 关系模式由五部分组成,是一个五元组:
R(U, D, DOM, F)- 关系名R是符号化的元组语义
- U为一组属性
- D为属性组U中的属性所来自的域
- DOM为属性到域的映射
- F为属性组U上的一组数据依赖
- 由于D、DOM与模式设计关系不大,因此在本章中把关系模式看作一个三元组:R<U,F>
- 当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系
- 作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)
- 一对一联系
- 设X,Y为关系中的属性或属性组,它们的所有可能取值组成两个集合。如果对于X中的任一具体值Y中至多有一个值与之对应,称X,Y这两个属性之间是一对一联系。
- 例:在读者关系中,借书证号是唯一的,如果读者没有重名的,姓名与借书证号两个属性之间是1:1联系。姓名可以确定借书证号,借书证号也可以确定姓名。
- 如果属性值集合X中的任一个具体值,至多与Y中的一个值相对应,而Y中的任一个具体值却可以和X中的多个值相对应,则称两个属性间从X到Y为m:1的联系或从Y到X是1:m的联系。
- 注意:这里指的是属性值个数的多少,而不是具有相同属性值的有多少个元组,二者正好相反。
- 例:在图书关系中,一本书有若干副本,它们有相同的书名、作者、分类号等,但每本书有唯一的总编号。书名与总编号之间是1:m,即同一个书名,有多个总编号与之对应。
- 在X,Y两个属性值集中,如果任一个值都可以至多和另一个属性值集中多个值对应,反之亦然,则称属性X和Y是m:n关系。
- 例:在借阅关系中,一个读者可以借多本书,即同一个借书证号有若干个图书总编号与之对应。由总编号标识的一本书在不同日期可以被不同的读者借阅。
- 数据依赖
- 是一个关系内部属性与属性之间的一种约束关系
- 通过属性间值的相等与否体现出来的数据间相互联系
- 是现实世界属性间相互联系的抽象
- 是数据内在的性质
- 是语义的体现
- 是一个关系内部属性与属性之间的一种约束关系
- 数据依赖的主要类型
- 函数依赖(Functional Dependency,简记为FD)
- 多值依赖(Multi-Valued Dependency,简记为MVD)
- 函数依赖普遍存在于现实生活中
- 描述一个学生关系,可以有学号、姓名、系名等属性。
- 一个学号只对应一个学生,一个学生只在一个系中学习
- “学号”值确定后,学生的姓名及所在系的值就被唯一确定。
- Sname=f(Sno),Sdept=f(Sno)
- 即Sno函数决定Sname
- Sno函数决定Sdept
- 记作Sno→Sname,Sno→Sdept
- 描述一个学生关系,可以有学号、姓名、系名等属性。
- [例6.1] 建立一个描述学校教务的数据库。
涉及的对象包括:- 学生的学号(Sno)
- 所在系(Sdept)
- 系主任姓名(Mname)
- 课程号(Cno)
- 成绩(Grade)
-
- 假设学校教务的数据库模式用一个单一的关系模式Student来表示,则该关系模式的属性集合为:
-
U ={Sno, Sdept, Mname, Cno, Grade}
-
- 现实世界的已知事实(语义):
- 一个系有若干学生, 但一个学生只属于一个系;
- 一个系只有一名(正职)负责人;
- 一个学生可以选修多门课程,每门课程有若干学生选修;
- 每个学生学习每一门课程有一个成绩。
- 由此可得到属性组U上的一组函数依赖F:
- 现实世界的已知事实(语义):
-
F={Sno→Sdept, Sdept→ Mname, (Sno, Cno)→ Grade}
关系模式Student<U, F>中存在的问题:
(1)数据冗余
-
- 浪费大量的存储空间
- 每一个系主任的姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。
- 浪费大量的存储空间
-
(2)更新异常(Update Anomalies)
-
- 数据冗余 ,更新数据时,维护数据完整性代价大。
- 某系更换系主任后,必须修改与该系学生有关的每一个元组。
- 数据冗余 ,更新数据时,维护数据完整性代价大。
-
(3)插入异常(Insertion Anomalies)
-
- 如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
-
(4)删除异常(Deletion Anomalies)
-
- 如果某个系的学生全部毕业了, 则在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
- 结论
- Student关系模式不是一个好的模式。
- 一个“好”的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽可能少。
- 原因
- 由存在于模式中的某些数据依赖引起的。
- 解决方法
- 用规范化理论改造关系模式来消除其中不合适的数据依赖
- 把这个单一的模式分成三个关系模式:
- S(Sno,Sdept,Sno → Sdept);
- SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
- DEPT(Sdept,Mname,Sdept → Mname);
- 这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。
- 问题:
- 插入异常:如果没有职工具有8级工资,则8级工资的工资数额就难以插入。
- 删除异常:如果仅有职工赵明具有4级工资,如果将赵明删除,则有关4级工资的工资数额信息也随之删除了。
- 数据冗余:职工很多,工资级别有限,每一级别的工资数额反复存储多次。
- 更新异常:如果将5级工资的工资数额调为1620,则需要找到每个具有5级工资的职工,逐一修改。
-
6.2 规范化
规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
6.2.1 函数依赖
1.函数依赖
2.平凡函数依赖与非平凡函数依赖
3.完全函数依赖与部分函数依赖
4.传递函数依赖
- 定义6.1 设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
- 函数依赖与属性间的联系类型有关
- (1) 一对一联系:X←→Y
- (2) 多对一联系:X→Y
- (3) 多对多联系:不存在依赖关系
-
(4) 可从属性间的联系类型来分析属性间的函数依赖
1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立
3. 数据库设计者可以对现实世界作强制的规定。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在, 则拒绝装入该元组。
- 由下面的关系表, 能否得出Sno → Sname
-
函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件
- 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。
- 在R(U)中,如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖,记作X → Y。
- 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X → Y
- 在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 码
- 设K为R<U,F>中的属性或属性组合。若K → U,则K称为R的一个候选码(Candidate Key)。
- 如果U部分函数依赖于K,即K → U,则K称为超码 (Surpkey)。候选码是最小的超码,即K的任意一个真子集都不是候选码。
- 若关系模式R有多个候选码,则选定其中的一个做为主码(Primary key)。
- 主属性与非主属性
- 包含在任何一个候选码中的属性 ,称为主属性 (Prime attribute)
- 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
- 全码:整个属性组是码,称为全码(All-key)
- 关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码。
- SC(Sno,Cno,Grade)中,Sno不是码
- Sno是 S(Sno,Sdept,Sage)的码,则Sno是SC的外码
-
主码与外部码一起提供了表示关系间联系的手段
关系模式S(S# , SN , SD , DEAN , C# , G)
主码:(S#,C#)
函数依赖:
(S#,C#) G
- ® SN,(S#,C#) SN
- ® SD,(S#,C#) SD
- ® DEAN, S# ® DEAN
-
(S#,C#) DEAN
6.2.3 范式
- 范式是符合某一种级别的关系模式的集合。
- 关系数据库中的关系必须满足一定的要求。满足 不同程度要求的为不同范式。
- 范式的种类:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- BC范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF)
- 各种范式之间存在联系:
- 某一关系模式R为第n范式,可简记为R∈nNF。
- 一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(normalization)。
-
6.2.4 2NF
- 定义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
-
- 一个关系模式不属于2NF,会产生以下问题:
- 插入异常
- 如果插入一个新学生,但该生未选课,即该生无Cno,由于插入元组时,必须给定码值,因此插入失败。
- 删除异常
- 如果S4只选了一门课C3,现在他不再选这门课,则删除C3后,整个元组的其他信息也被删除了。
- 修改复杂
- 如果一个学生选了多门课,则Sdept,Sloc被存储了多次。如果该生转系,则需要修改所有相关的Sdept和Sloc,造成修改的复杂化。
- 插入异常
- 出现这种问题的原因
- 例子中有两类非主属性:
- 一类如Grade,它对码完全函数依赖
- 另一类如Sdept、Sloc,它们对码不是完全函数依赖
- 例子中有两类非主属性:
- 解决方法:
- 用投影分解把关系模式S-L-C分解成两个关系模式
- SC(Sno,Cno,Grade)
- S-L(Sno,Sdept,Sloc)
- SC的码为(Sno,Cno),SL的码为Sno,这样使得非主属性对码都是完全函数依赖了
- 用投影分解把关系模式S-L-C分解成两个关系模式
-
6.2.5 3NF
- 设关系模式R<U,F>∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Z ⊇ Y), 使得X→Y,Y→Z成立,Y ↛ X不成立,则称R<U,F> ∈ 3NF。
-
SC没有传递依赖,因此SC ∈ 3NF
- 不良特性
- 插入异常:如果系中没有学生,则有关系的信息就无法插入。
- 删除异常:如果学生全部毕业了,则在删除学生信息的同时有关系的信息也随之删除了。
- 更新异常:如果学生转系,不但要修改SDept,还要修改Sloc,如果换Sloc,则该系每个学生元组都要做相应修改。
- 数据冗余:每个学生都存储了所在系的Sloc的信息。
- 解决方法
-
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D(Sno, Sdept)
D-L(Sdept,Sloc)
S-D的码为Sno, D-L的码为Sdept。
-
- 分解后的关系模式S-D与D-L中不再存在传递依赖
- 说明
-
(1) 每个非主属性既不部分依赖,也不传递依赖于R的任何码。
(2) 从1NF→2NF:消除非主属性对码的部分函数依赖
(3) 从2NF→3NF:消除非主属性对码的传递函数依赖
(4) 从一个表中删去不依赖于主码的数据列。
6.2.6 BCNF
- BCNF(Boyce Codd Normal Form)由Boyce和Codd提出,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
- 定义6.8 设关系模式R<U,F>∈1NF,若X →Y且Y ⊆ X时X必含有码,则R<U,F>∈BCNF。
- 换言之,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。
- 不良特性
- 插入异常:如果没有学生选修某位老师的任课,则该老师担任课程的信息就无法插入。
- 删除异常:删除学生选课信息,会删除掉老师的任课信息。
- 更新异常:如果老师所教授的课程有所改动,则所有选修该老师课程的学生元组都要做改动。
- 数据冗余:每位学生都存储了有关老师所教授的课程的信息。
- 症由:
-
主属性对码的不良依赖。
- 非BCNF的关系模式也可以通过分解成为BCNF。例如STJ可分解为ST(S,T)与TJ(T,J),它们都是BCNF。
- 没有任何属性对码的部分函数依赖和传递函数依赖
- 3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的测度。
- 一个模式中的关系模式如果都属于BCNF,那么在函数依赖范畴内,它已实现了彻底的分离,已消除了插入和删除的异常。
- 3NF的“不彻底”性表现在可能存在主属性对码的部分依赖和传递依赖。
- ⒈ 所有非主属性都完全函数依赖于每个候选码
- ⒉ 所有主属性都完全函数依赖于每个不包含它的候选码
- ⒊ 没有任何属性完全函数依赖于非码的任何一组属性
-
6.2.7 多值依赖
- Teaching具有唯一候选码(C,T,B), 即全码。
- Teaching∈BCNF
- 设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
- 例 Teaching(C, T, B)
-
对于C的每一个值,T有一组值与之对应,而不论
B取何值。因此T多值依赖于C,即C→→T。
- 多值依赖的另一个等价的定义
-
在R(U)的任一关系r中,如果存在元组t,s使得t[X]=s[X]
,那么就必然存在元组w,v∈r,(w,v可以与s,t相
同), 使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],
v[Y]=s[Y],v[Z]=t[Z](即交换s,t元组的Y值所得的两
个新元组必在r中则Y多值依赖于X,记为X→→Y。这里
X,Y是U的子集,Z=U-X-Y。
- 平凡多值依赖和非平凡的多值依赖
- 若X→→Y,而Z=Ф,即Z为空,则称X→→Y为平凡的多值依赖。
- 否则称X→→Y为非平凡的多值依赖。
- 找出关系上所满足的多值依赖。
-
- ®®C
- ®®A
- C®®B?若使B®®C成立,需加入哪些元组?
- 按照语义对于W的每一个值Wi,S有一个完整的集合与之对应而不问C取何值。所以W→→S。
- 如图6.7所示
- 对应W的某一个值Wi的全部S值记作{S}Wi(表示此仓库工作的全部保管员)
- 全部C值记作{C}Wi(表示在此仓库中存放的所有商品)
- 应当有{S}Wi中的每一个值和{C}Wi中的每一个C值对应
- 于是{S}Wi与{C}Wi之间正好形成一个完全二分图,因而W→→S。
- 由于C与S的完全对称性,必然有W→→C成立。
-
- 多值依赖的性质
-
(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。
- 多值依赖与函数依赖的区别
-
(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
- 关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R<U,F>∈4NF。
- 不允许有非平凡且非函数依赖的多值依赖。
- 允许的非平凡多值依赖实际上是函数依赖。
- 6.2.9 规范化小结
- 在关系数据库中,对关系模式的基本要求是满足第一范式。
- 规范化程度过低的关系不一定能够很好地描述现实世界
- 可能存在插入异常、删除异常、修改复杂、数据冗余等问题
-
解决方法就是对其进行规范化,转换成高级范式。
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化。
- 关系数据库的规范化理论是数据库逻辑设计的工具。
- 规范化的基本思想
- 是逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”。
- 即采用“一事一地”的模式设计原则
- 让一个关系描述一个概念、一个实体或者实体间的一种联系。
- 若多于一个概念就把它“分离”出去。
- 因此 规范化实质上是概念的单一化。
-
关系模式规范化的基本步骤
1NF
↓ 消除非主属性对码的部分函数依赖
消除决定因素 2NF
非码的非平凡 ↓ 消除非主属性对码的传递函数依赖
函数依赖 3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF
- 不能说规范化程度越高的关系模式就越好。
- 必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。
- 上面的规范化步骤可以在其中任何一步终止。
-
6.3 数据依赖的公理系统
- 定义6.11 对于满足一组函数依赖F的关系模式 R <U,F>,其任何一个关系r,若函数依赖X→Y都成立(即r中任意两元组t、s,若t[X]=s[X],则 t[Y]=s[Y]),则称F逻辑蕴涵X →Y。
- Armstrong公理系统
- 一套推理规则,是模式分解算法的理论基础
- 用途
- 求给定关系模式的码
- 从一组函数依赖求得蕴涵的函数依赖
- Armstrong公理系统 设U为属性集总体,F是U上的一组函数依赖, 于是有关系模式R <U,F >。对R <U,F> 来说有以下的推理规则:
- A1 自反律(reflexivity rule):若Y Í X Í U,则X →Y 为F所蕴涵。
- A2 增广律(augmentation rule):若X→Y为F所蕴涵,且Z Í U,则XZ→YZ 为F所蕴涵。
- A3 传递律(transitivity rule):若X→Y及Y→Z为F所蕴涵,则X→Z 为F所蕴涵。
-
注意:由自反律所得到的函数依赖均是平凡的函数依赖,
自反律的使用并不依赖于F。
- 根据A1,A2,A3这三条推理规则可以得到下面三条推理规则:
- 合并规则(union rule):
-
由X→Y,X→Z,有X→YZ。
-
- 伪传递规则(pseudo transitivity rule):
-
由X→Y,WY→Z,有XW→Z。
-
- 分解规则(decomposition rule):
- X→Y及ZÍY,有X→Z。
- 根据合并规则和分解规则,可得引理6.1
- 引理6.1 X→A1 A2…Ak成立的充分必要条件是X→Ai成立(i=1,2,…,k)。
- 定义6.12 在关系模式R<U,F>中为F所逻辑蕴涵的函数依赖的全体叫作F的闭包,记为F +。
- 定义6.13 设F为属性集U上的一组函数依赖,X、Y ÍU, XF+={ A|X→A能由F根据Armstrong公理导出},XF+称为属性集X关于函数依赖集F的闭包。
- 引理6.2 设F为属性集U上的一组函数依赖,X、Y Í U,X→Y能由F根据Armstrong公理导出的充分必要条件是Y ÍXF+。
- 引理6.2的用途
-
判定X→Y是否能由F根据Armstrong公理导出的问题,就
转化为求出XF+,判定Y是否为XF+的子集的问题。
- 求闭包的算法
- 算法6.1 求属性集X(X Í U)关于U上的函数依赖集F的闭包XF+
- 输入:X,F
- 输出:XF+
- 步骤:
- 令X(0)=X,i=0
- 求B,这里B ={ A |($ V)( $ W)(V→WÎF
- V Í X(i)AÎ W)}。
- X(i+1)=B∪X(i) 。
- 判断X(i+1)= X(i) 。
- 若X(i+1)与X(i)相等或X(i)=U ,则X(i)就是XF+,
-
算法终止。
- 若否,则i=i+1,返回第②步。
-
对于算法6.1, 令ai =|X(i)|,{ai }形成一个步长大于1的严格递增的序列,序列的上界是 | U |,因此该算法最多 |U| - |X| 次循环就
会终止。
-
- 由引理二,判定X®Y是否能由F根据Armstrong公理导出,可转化为求 ,判定YÍ 是否成立。
-
输入:X,F
输出:
1) := X;
- )考察每个F中的函数依赖 A®B,
- A Í ,则 := ÈB
-
3)继续考察,直到 不再增大为止。
- 函数依赖集的等价变换
- 例:r是关系模式R(A, B, C)上的一个关系,用SQL检测在r上是否满足函数依赖B ® C。
-
- 有效性与完备性的含义
- 有效性:由F 出发根据Armstrong公理推导出来的每一个函数依赖一定在F +中
- 完备性:F +中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来
- Armstrong公理的完备性及有效性说明:
- “导出”与“蕴涵”是两个完全等价的概念
- F+ :为F所逻辑蕴涵的函数依赖的全体(定义6.12 )
- F+ :可以说成由F出发借助Armstrong公理导出的函数依赖的集合
- 定义6.14 如果G+=F+,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。
- 引理6.3 F+ = G+ 的充分必要条件是F Í G+和GÍ F+ 。
- 要判定F Í G+,只须逐一对F中的函数依赖X→Y,考察 Y 是否属于XG++ 就行了。因此引理6.3 给出了判断两个函数依赖集等价的可行算法。
- 定义6.15 如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集,亦称为最小依赖集或最小覆盖。
-
(1)单属性化: F中任一函数依赖的右部仅含有一个属性。
(2)无冗余化: F中不存在这样的函数依赖X→A, 使得F与F-{X→A}等价。
(3)既约化: F中不存在这样的函数依赖X→A, X有真子集Z使得F-{X→A}∪{Z→A}与F等价。
- 定理6.3 每一个函数依赖集F均等价于一个极小函数依赖集Fm。此Fm称为F的最小依赖集。
- 证:构造性证明,分三步对F进行“极小化处理”,找出F的一个最小依赖集。
-
(1)逐一检查F中各函数依赖FDi:X→Y,
若Y=A1A2 …Ak,k≥2,
则用{X→Aj | j=1,2,…,k}来取代X→Y。
引理6.1保证了F变换前后的等价性。
(2)逐一检查F中各函数依赖FDi:X→A,
令G=F-{X→A},
- AÎXG+,则从F中去掉此函数依赖。
- F与G 等价的充要条件是AÎXG+
-
因此F变换前后是等价的。
(3)逐一取出F中各函数依赖FDi:X→A,
设X=B1B2…Bm,m≥2,
逐一考查Bi (i=1,2,…,m),
- A Î(X-Bi )F+,则以X-Bi 取代X。
-
由于F与F-{X→A}∪{Z→A}等价的充要条件是
- ÎZF+ ,其中Z=X-Bi ,因此F变换前后是等价的。
-
最后剩下的F就一定是极小依赖集。
因为对F的每一次“改造”都保证了改造前后的两个函数
依赖集等价,因此剩下的F与原来的F等价。
证毕
- 定理6.3的证明过程
- 是求F极小依赖集的过程
- 也是检验F是否为极小依赖集的一个算法
-
若改造后的F与原来的F相同,说明F就是一个最小依赖集
- F的最小依赖集Fm不一定是唯一的,它与对各函数依赖FDi 及X→A中X各属性的处置顺序有关。
- F = {A®B,B®A,A®C,B®C},求Fm。
- 检查A®B,G=F-{A®B}={B®A,A®C,B®C}
- ,C},BÏ{A,C}
-
- 检查A®C,G=F-{A®C}={A®B,B®A,B®C}
- ,B,C},CÎ{A,B,C}
- F中删除A®C,
- m = {A®B,B®A,B®C}
- Fm= {A®B,B®A,A®C}
- = {C®A,A®G,CG®B,B®A},求m。
-
F是无冗余的。
- CG®B,
- = = {G}
- Ï
-
- = = {C,A,G,B}
- Î ,以C代替CG
- Fm = {C®A,A®G,C®B,B®A}
- 在R<U,F>中可以用与F等价的依赖集G来取代F
- 原因:两个关系模式R1 <U,F>,R2<U,G>,如果F与G等价,那么R1的关系一定是R2的关系。反过来,R2的关系也一定是R1的关系。
-
、
- 把低一级的关系模式分解为若干个高一级的关系模式的方法不是唯一的
- 只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义
- 三种模式分解等价的定义:
- *6.4 模式的分解
-
⒈ 分解具有无损连接性⒉ 分解要保持函数依赖
⒊ 分解既要保持函数依赖,又要具有无损连接性
关系模式R<U,F>的一个分解:
ρ={ R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>}
- ∪Ui,且不存在 Ui Í Uj,Fi 为 F在 Ui 上的投影
- 6.17 函数依赖集合{X→Y | X→Y Î F+∧XY ÍUi} 的一个覆盖 Fi 叫作 F 在属性 Ui 上的投影
- R<U , F> , U = (A , B , C) , F = {A®B , B®C}可以有分解:
- , Æ > , R2<B , Æ > , R3<C , Æ >}
- , B},{A®B}> , R2<{A , C},{A®C}>}
- 关系模式R<U,F>的一个分解 ρ={ R1<U1,F1>,R2<U2,F2>, …,Rn<Un,Fn>}
-
若R与R1、R2、…、Rn自然连接的结果相等,则称关系模式R的这个分解ρ具有无损连接性(Lossless join)
- 具有无损连接性的分解保证不丢失信息
- 无损连接性不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题
-
将SL分解为下面二个关系模式:
ND(Sno, Sdept)
NL(Sno, Sloc)
第3种分解方法具有无损连接性
问题:这种分解方法没有保持原关系中的函数依赖
-
- SL中的函数依赖Sdept→Sloc没有投影到关系模式ND、NL上
- 设关系模式R<U,F>被分解为若干个关系模式
- R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>
- (其中U=U1∪U2∪…∪Un,且不存在Ui Í Uj,Fi为F在Ui上的投影),若F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖Fi所逻辑蕴含,则称关系模式R的这个分解是保持函数依赖的(Preserve dependency)
- . 将SL分解为下面二个关系模式:
- ND(Sno, Sdept)
- DL(Sdept, Sloc)
- 这种分解方法就保持了函数依赖
- 如果一个分解具有无损连接性,则它能够保证不丢失信息
- 如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况
- 分解具有无损连接性和分解保持函数依赖是两个互相独立的标准。具有无损连接性的分解不一定能够保持函数依赖;同样,保持函数依赖的分解也不一定具有无损连接性。
- 将SL分解为下面二个关系模式:
- ND(Sno, Sdept)
- DL(Sdept, Sloc)
- 这种分解方法就保持了函数依赖
- 第1种分解方法既不具有无损连接性,也未保持函数依赖,它不是原关系模式的一个等价分解
- 第2种分解方法未保持了函数依赖,不具有无损连接性
- 第3种分解方法具有无损连接性,但未保持函数依赖
- 第4种分解方法既具有无损连接性,又保持了函数依赖
- 算法6.2 判别一个分解的无损连接性
- 算法6.3(合成法)转换为3NF的保持函数依赖的分解。
- 算法6.4 转换为3NF既有无损连接性又保持函数依赖的分解
- 算法6.5 (分解法)转换为BCNF的无损连接分解
- 算法6.6 达到4NF的具有无损连接性的分解
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF。
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF。
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF。
- 定理
- U1ÇU2 ® U1(或U2),则r =∏U1(r) ∏U2(r) 。
-
-
- 一般定义
-
关系模式R<U , F> ,U = Ui ,
- = {R1<U1 , F1> , R2<U2 , F2>, … , Rn<Un , Fn>}是R<U , F>的一个分解,r是R<U , F>的一个关系。
- mr(r) = ∏Ri(r) ,若对于R<U , F>的任一个关系r,都有r = mr (r),则称r是R<U , F>的一个无损连接分解。
- 算法:(判别一个分解的无损连接性)
-
U={A1, A2, … , An}
- = {R1<U1 , F1> , R2<U2 , F2>, … , Rk<Uk , Fk>}
-
⒈建立一个n列k行的矩阵
- = {Cij | 若Aj Î Ui , Cij = aj , 否则Cij = bij}
- F中每一个函数依赖X®Y,若TB中存在元组 t1,t2,使得t1[X]=t2[X],t1[Y]≠t2[Y],则每一个Ai Î Y:
-
①若t1[Ai],t2[Ai]中有一个等于aj,则另一个也
改为aj ;
②若①不成立,则全部改为bmj,m是这些行的行号最小值。
反复执行⒉,直至:
①TB中出现一行为a1, a2 , … , an 的一行。
② TB不再发生变化,且没有一行为a1, … , an。
- ①情况下, r为无损分解,否则为有损分解
- 算法:(达到BCNF无损连接分解算法)
-
给定关系模式R<U , F> ,
- 令r = {R<U , F>}
- 检查r中各关系模式是否属于BCNF,若是,则 算法终止。
- 设r 中Ri<Ui , Fi>不属于BCNF,
- X®AÎ ,且X不是Ri的码,
- XA是Ri的真子集,将Ri分解为s={S1,S2},
- US1 = XA, US2 = Ui - {A}
- s代替Ri ,返回到⒉
- 算法:(达到4NF无损连接分解算法)
-
给定关系模式R<U , F> ,
- 令r = {R<U , F>}
- 检查r中各关系模式是否属于4NF,若是,则算法终止。
- 设r 中Ri<Ui , Fi>不属于4NF,
- X®®A,X不是Ri的码,
- XA是Ri的真子集,将Ri分解为s={S1,S2},
- US1 = XA, US2 = Ui - {A}
- s代替Ri ,返回到⒉
- 保持函数依赖的分解
- 定义
- F+ = ( È Fi)+, 则称R< U , F >的分解
- = {R1<U1 , F1> , … , Rn<Un , Fn>}保持函数依赖。
-
如表(职工,级别,工资)的分解,
分解一:(职工,工资),(工资,级别)
- ®级别
-
分解二:(职工,级别),(工资,级别)
保持函数依赖。
-
- 结论:若要求分解保持函数依赖,那么分解后的模式总可以达到3NF,但不一定能达到BCNF。
- 算法:(达到3NF且保持函数依赖的分解)
-
⒈求F的极小函数依赖集Fm 。
⒉找出不在Fm中出现的属性,将它们构成一个关 系模式,并从U中去掉它们(剩余属性仍记为U)。
- 若有X®AÎ Fm ,且XA=U,
-
则={R},算法终止。
- Fm按具有相同左部的原则进行分组(设为k组),每一组函数依赖所涉及的属性全体为Ui,若Ui Í Uj就去掉Ui。令Fi为Fm在Ui上的投影,则r = {R1<U1 , F1> , … , Rk<Uk , Fk>}是R<U , F>的一个保持函数依赖的分解,并且每个Ri<Ui , Fi> Î3NF。
- 算法:(达到3NF且同时保持无损连接与函数依赖的分解)
- r = {R1<U1 , F1> , … ,Rk<Uk , Fk>}是R<U , F>的一个保持函数依赖的3NF分解。
-
第六章 关系数据理论
6.1 问题的提出
关系数据库逻辑设计
-
- 针对具体问题,如何构造一个适合于它的数据模式
- 数据库逻辑设计的工具──关系数据库的规范化理论
- 关系模式由五部分组成,是一个五元组:
R(U, D, DOM, F)- 关系名R是符号化的元组语义
- U为一组属性
- D为属性组U中的属性所来自的域
- DOM为属性到域的映射
- F为属性组U上的一组数据依赖
- 由于D、DOM与模式设计关系不大,因此在本章中把关系模式看作一个三元组:R<U,F>
- 当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系
- 作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)
- 一对一联系
- 设X,Y为关系中的属性或属性组,它们的所有可能取值组成两个集合。如果对于X中的任一具体值Y中至多有一个值与之对应,称X,Y这两个属性之间是一对一联系。
- 例:在读者关系中,借书证号是唯一的,如果读者没有重名的,姓名与借书证号两个属性之间是1:1联系。姓名可以确定借书证号,借书证号也可以确定姓名。
- 如果属性值集合X中的任一个具体值,至多与Y中的一个值相对应,而Y中的任一个具体值却可以和X中的多个值相对应,则称两个属性间从X到Y为m:1的联系或从Y到X是1:m的联系。
- 注意:这里指的是属性值个数的多少,而不是具有相同属性值的有多少个元组,二者正好相反。
- 例:在图书关系中,一本书有若干副本,它们有相同的书名、作者、分类号等,但每本书有唯一的总编号。书名与总编号之间是1:m,即同一个书名,有多个总编号与之对应。
- 在X,Y两个属性值集中,如果任一个值都可以至多和另一个属性值集中多个值对应,反之亦然,则称属性X和Y是m:n关系。
- 例:在借阅关系中,一个读者可以借多本书,即同一个借书证号有若干个图书总编号与之对应。由总编号标识的一本书在不同日期可以被不同的读者借阅。
- 数据依赖
- 是一个关系内部属性与属性之间的一种约束关系
- 通过属性间值的相等与否体现出来的数据间相互联系
- 是现实世界属性间相互联系的抽象
- 是数据内在的性质
- 是语义的体现
- 是一个关系内部属性与属性之间的一种约束关系
- 数据依赖的主要类型
- 函数依赖(Functional Dependency,简记为FD)
- 多值依赖(Multi-Valued Dependency,简记为MVD)
- 函数依赖普遍存在于现实生活中
- 描述一个学生关系,可以有学号、姓名、系名等属性。
- 一个学号只对应一个学生,一个学生只在一个系中学习
- “学号”值确定后,学生的姓名及所在系的值就被唯一确定。
- Sname=f(Sno),Sdept=f(Sno)
- 即Sno函数决定Sname
- Sno函数决定Sdept
- 记作Sno→Sname,Sno→Sdept
- 描述一个学生关系,可以有学号、姓名、系名等属性。
- [例6.1] 建立一个描述学校教务的数据库。
涉及的对象包括:- 学生的学号(Sno)
- 所在系(Sdept)
- 系主任姓名(Mname)
- 课程号(Cno)
- 成绩(Grade)
-
- 假设学校教务的数据库模式用一个单一的关系模式Student来表示,则该关系模式的属性集合为:
-
U ={Sno, Sdept, Mname, Cno, Grade}
-
- 现实世界的已知事实(语义):
- 一个系有若干学生, 但一个学生只属于一个系;
- 一个系只有一名(正职)负责人;
- 一个学生可以选修多门课程,每门课程有若干学生选修;
- 每个学生学习每一门课程有一个成绩。
- 由此可得到属性组U上的一组函数依赖F:
- 现实世界的已知事实(语义):
-
F={Sno→Sdept, Sdept→ Mname, (Sno, Cno)→ Grade}
关系模式Student<U, F>中存在的问题:
(1)数据冗余
-
- 浪费大量的存储空间
- 每一个系主任的姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。
- 浪费大量的存储空间
-
(2)更新异常(Update Anomalies)
-
- 数据冗余 ,更新数据时,维护数据完整性代价大。
- 某系更换系主任后,必须修改与该系学生有关的每一个元组。
- 数据冗余 ,更新数据时,维护数据完整性代价大。
-
(3)插入异常(Insertion Anomalies)
-
- 如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
-
(4)删除异常(Deletion Anomalies)
-
- 如果某个系的学生全部毕业了, 则在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
- 结论
- Student关系模式不是一个好的模式。
- 一个“好”的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽可能少。
- 原因
- 由存在于模式中的某些数据依赖引起的。
- 解决方法
- 用规范化理论改造关系模式来消除其中不合适的数据依赖
- 把这个单一的模式分成三个关系模式:
- S(Sno,Sdept,Sno → Sdept);
- SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
- DEPT(Sdept,Mname,Sdept → Mname);
- 这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。
- 问题:
- 插入异常:如果没有职工具有8级工资,则8级工资的工资数额就难以插入。
- 删除异常:如果仅有职工赵明具有4级工资,如果将赵明删除,则有关4级工资的工资数额信息也随之删除了。
- 数据冗余:职工很多,工资级别有限,每一级别的工资数额反复存储多次。
- 更新异常:如果将5级工资的工资数额调为1620,则需要找到每个具有5级工资的职工,逐一修改。
-
6.2 规范化
规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
6.2.1 函数依赖
1.函数依赖
2.平凡函数依赖与非平凡函数依赖
3.完全函数依赖与部分函数依赖
4.传递函数依赖
- 定义6.1 设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
- 函数依赖与属性间的联系类型有关
- (1) 一对一联系:X←→Y
- (2) 多对一联系:X→Y
- (3) 多对多联系:不存在依赖关系
-
(4) 可从属性间的联系类型来分析属性间的函数依赖
1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立
3. 数据库设计者可以对现实世界作强制的规定。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在, 则拒绝装入该元组。
- 由下面的关系表, 能否得出Sno → Sname
-
函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件
- 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。
- 在R(U)中,如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖,记作X → Y。
- 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X → Y
- 在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 码
- 设K为R<U,F>中的属性或属性组合。若K → U,则K称为R的一个候选码(Candidate Key)。
- 如果U部分函数依赖于K,即K → U,则K称为超码 (Surpkey)。候选码是最小的超码,即K的任意一个真子集都不是候选码。
- 若关系模式R有多个候选码,则选定其中的一个做为主码(Primary key)。
- 主属性与非主属性
- 包含在任何一个候选码中的属性 ,称为主属性 (Prime attribute)
- 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
- 全码:整个属性组是码,称为全码(All-key)
- 关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码。
- SC(Sno,Cno,Grade)中,Sno不是码
- Sno是 S(Sno,Sdept,Sage)的码,则Sno是SC的外码
-
主码与外部码一起提供了表示关系间联系的手段
关系模式S(S# , SN , SD , DEAN , C# , G)
主码:(S#,C#)
函数依赖:
(S#,C#) G
- ® SN,(S#,C#) SN
- ® SD,(S#,C#) SD
- ® DEAN, S# ® DEAN
-
(S#,C#) DEAN
6.2.3 范式
- 范式是符合某一种级别的关系模式的集合。
- 关系数据库中的关系必须满足一定的要求。满足 不同程度要求的为不同范式。
- 范式的种类:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- BC范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF)
- 各种范式之间存在联系:
- 某一关系模式R为第n范式,可简记为R∈nNF。
- 一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(normalization)。
-
6.2.4 2NF
- 定义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
-
- 一个关系模式不属于2NF,会产生以下问题:
- 插入异常
- 如果插入一个新学生,但该生未选课,即该生无Cno,由于插入元组时,必须给定码值,因此插入失败。
- 删除异常
- 如果S4只选了一门课C3,现在他不再选这门课,则删除C3后,整个元组的其他信息也被删除了。
- 修改复杂
- 如果一个学生选了多门课,则Sdept,Sloc被存储了多次。如果该生转系,则需要修改所有相关的Sdept和Sloc,造成修改的复杂化。
- 插入异常
- 出现这种问题的原因
- 例子中有两类非主属性:
- 一类如Grade,它对码完全函数依赖
- 另一类如Sdept、Sloc,它们对码不是完全函数依赖
- 例子中有两类非主属性:
- 解决方法:
- 用投影分解把关系模式S-L-C分解成两个关系模式
- SC(Sno,Cno,Grade)
- S-L(Sno,Sdept,Sloc)
- SC的码为(Sno,Cno),SL的码为Sno,这样使得非主属性对码都是完全函数依赖了
- 用投影分解把关系模式S-L-C分解成两个关系模式
-
6.2.5 3NF
- 设关系模式R<U,F>∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Z ⊇ Y), 使得X→Y,Y→Z成立,Y ↛ X不成立,则称R<U,F> ∈ 3NF。
-
SC没有传递依赖,因此SC ∈ 3NF
- 不良特性
- 插入异常:如果系中没有学生,则有关系的信息就无法插入。
- 删除异常:如果学生全部毕业了,则在删除学生信息的同时有关系的信息也随之删除了。
- 更新异常:如果学生转系,不但要修改SDept,还要修改Sloc,如果换Sloc,则该系每个学生元组都要做相应修改。
- 数据冗余:每个学生都存储了所在系的Sloc的信息。
- 解决方法
-
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D(Sno, Sdept)
D-L(Sdept,Sloc)
S-D的码为Sno, D-L的码为Sdept。
-
- 分解后的关系模式S-D与D-L中不再存在传递依赖
- 说明
-
(1) 每个非主属性既不部分依赖,也不传递依赖于R的任何码。
(2) 从1NF→2NF:消除非主属性对码的部分函数依赖
(3) 从2NF→3NF:消除非主属性对码的传递函数依赖
(4) 从一个表中删去不依赖于主码的数据列。
6.2.6 BCNF
- BCNF(Boyce Codd Normal Form)由Boyce和Codd提出,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
- 定义6.8 设关系模式R<U,F>∈1NF,若X →Y且Y ⊆ X时X必含有码,则R<U,F>∈BCNF。
- 换言之,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。
- 不良特性
- 插入异常:如果没有学生选修某位老师的任课,则该老师担任课程的信息就无法插入。
- 删除异常:删除学生选课信息,会删除掉老师的任课信息。
- 更新异常:如果老师所教授的课程有所改动,则所有选修该老师课程的学生元组都要做改动。
- 数据冗余:每位学生都存储了有关老师所教授的课程的信息。
- 症由:
-
主属性对码的不良依赖。
- 非BCNF的关系模式也可以通过分解成为BCNF。例如STJ可分解为ST(S,T)与TJ(T,J),它们都是BCNF。
- 没有任何属性对码的部分函数依赖和传递函数依赖
- 3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的测度。
- 一个模式中的关系模式如果都属于BCNF,那么在函数依赖范畴内,它已实现了彻底的分离,已消除了插入和删除的异常。
- 3NF的“不彻底”性表现在可能存在主属性对码的部分依赖和传递依赖。
- ⒈ 所有非主属性都完全函数依赖于每个候选码
- ⒉ 所有主属性都完全函数依赖于每个不包含它的候选码
- ⒊ 没有任何属性完全函数依赖于非码的任何一组属性
-
6.2.7 多值依赖
- Teaching具有唯一候选码(C,T,B), 即全码。
- Teaching∈BCNF
- 设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
- 例 Teaching(C, T, B)
-
对于C的每一个值,T有一组值与之对应,而不论
B取何值。因此T多值依赖于C,即C→→T。
- 多值依赖的另一个等价的定义
-
在R(U)的任一关系r中,如果存在元组t,s使得t[X]=s[X]
,那么就必然存在元组w,v∈r,(w,v可以与s,t相
同), 使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],
v[Y]=s[Y],v[Z]=t[Z](即交换s,t元组的Y值所得的两
个新元组必在r中则Y多值依赖于X,记为X→→Y。这里
X,Y是U的子集,Z=U-X-Y。
- 平凡多值依赖和非平凡的多值依赖
- 若X→→Y,而Z=Ф,即Z为空,则称X→→Y为平凡的多值依赖。
- 否则称X→→Y为非平凡的多值依赖。
- 找出关系上所满足的多值依赖。
-
- ®®C
- ®®A
- C®®B?若使B®®C成立,需加入哪些元组?
- 按照语义对于W的每一个值Wi,S有一个完整的集合与之对应而不问C取何值。所以W→→S。
- 如图6.7所示
- 对应W的某一个值Wi的全部S值记作{S}Wi(表示此仓库工作的全部保管员)
- 全部C值记作{C}Wi(表示在此仓库中存放的所有商品)
- 应当有{S}Wi中的每一个值和{C}Wi中的每一个C值对应
- 于是{S}Wi与{C}Wi之间正好形成一个完全二分图,因而W→→S。
- 由于C与S的完全对称性,必然有W→→C成立。
-
- 多值依赖的性质
-
(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。
- 多值依赖与函数依赖的区别
-
(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
- 关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R<U,F>∈4NF。
- 不允许有非平凡且非函数依赖的多值依赖。
- 允许的非平凡多值依赖实际上是函数依赖。
- 6.2.9 规范化小结
- 在关系数据库中,对关系模式的基本要求是满足第一范式。
- 规范化程度过低的关系不一定能够很好地描述现实世界
- 可能存在插入异常、删除异常、修改复杂、数据冗余等问题
-
解决方法就是对其进行规范化,转换成高级范式。
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化。
- 关系数据库的规范化理论是数据库逻辑设计的工具。
- 规范化的基本思想
- 是逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”。
- 即采用“一事一地”的模式设计原则
- 让一个关系描述一个概念、一个实体或者实体间的一种联系。
- 若多于一个概念就把它“分离”出去。
- 因此 规范化实质上是概念的单一化。
-
关系模式规范化的基本步骤
1NF
↓ 消除非主属性对码的部分函数依赖
消除决定因素 2NF
非码的非平凡 ↓ 消除非主属性对码的传递函数依赖
函数依赖 3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF
- 不能说规范化程度越高的关系模式就越好。
- 必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。
- 上面的规范化步骤可以在其中任何一步终止。
-
6.3 数据依赖的公理系统
- 定义6.11 对于满足一组函数依赖F的关系模式 R <U,F>,其任何一个关系r,若函数依赖X→Y都成立(即r中任意两元组t、s,若t[X]=s[X],则 t[Y]=s[Y]),则称F逻辑蕴涵X →Y。
- Armstrong公理系统
- 一套推理规则,是模式分解算法的理论基础
- 用途
- 求给定关系模式的码
- 从一组函数依赖求得蕴涵的函数依赖
- Armstrong公理系统 设U为属性集总体,F是U上的一组函数依赖, 于是有关系模式R <U,F >。对R <U,F> 来说有以下的推理规则:
- A1 自反律(reflexivity rule):若Y Í X Í U,则X →Y 为F所蕴涵。
- A2 增广律(augmentation rule):若X→Y为F所蕴涵,且Z Í U,则XZ→YZ 为F所蕴涵。
- A3 传递律(transitivity rule):若X→Y及Y→Z为F所蕴涵,则X→Z 为F所蕴涵。
-
注意:由自反律所得到的函数依赖均是平凡的函数依赖,
自反律的使用并不依赖于F。
- 根据A1,A2,A3这三条推理规则可以得到下面三条推理规则:
- 合并规则(union rule):
-
由X→Y,X→Z,有X→YZ。
-
- 伪传递规则(pseudo transitivity rule):
-
由X→Y,WY→Z,有XW→Z。
-
- 分解规则(decomposition rule):
- X→Y及ZÍY,有X→Z。
- 根据合并规则和分解规则,可得引理6.1
- 引理6.1 X→A1 A2…Ak成立的充分必要条件是X→Ai成立(i=1,2,…,k)。
- 定义6.12 在关系模式R<U,F>中为F所逻辑蕴涵的函数依赖的全体叫作F的闭包,记为F +。
- 定义6.13 设F为属性集U上的一组函数依赖,X、Y ÍU, XF+={ A|X→A能由F根据Armstrong公理导出},XF+称为属性集X关于函数依赖集F的闭包。
- 引理6.2 设F为属性集U上的一组函数依赖,X、Y Í U,X→Y能由F根据Armstrong公理导出的充分必要条件是Y ÍXF+。
- 引理6.2的用途
-
判定X→Y是否能由F根据Armstrong公理导出的问题,就
转化为求出XF+,判定Y是否为XF+的子集的问题。
- 求闭包的算法
- 算法6.1 求属性集X(X Í U)关于U上的函数依赖集F的闭包XF+
- 输入:X,F
- 输出:XF+
- 步骤:
- 令X(0)=X,i=0
- 求B,这里B ={ A |($ V)( $ W)(V→WÎF
- V Í X(i)AÎ W)}。
- X(i+1)=B∪X(i) 。
- 判断X(i+1)= X(i) 。
- 若X(i+1)与X(i)相等或X(i)=U ,则X(i)就是XF+,
-
算法终止。
- 若否,则i=i+1,返回第②步。
-
对于算法6.1, 令ai =|X(i)|,{ai }形成一个步长大于1的严格递增的序列,序列的上界是 | U |,因此该算法最多 |U| - |X| 次循环就
会终止。
-
- 由引理二,判定X®Y是否能由F根据Armstrong公理导出,可转化为求 ,判定YÍ 是否成立。
-
输入:X,F
输出:
1) := X;
- )考察每个F中的函数依赖 A®B,
- A Í ,则 := ÈB
-
3)继续考察,直到 不再增大为止。
- 函数依赖集的等价变换
- 例:r是关系模式R(A, B, C)上的一个关系,用SQL检测在r上是否满足函数依赖B ® C。
-
- 有效性与完备性的含义
- 有效性:由F 出发根据Armstrong公理推导出来的每一个函数依赖一定在F +中
- 完备性:F +中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来
- Armstrong公理的完备性及有效性说明:
- “导出”与“蕴涵”是两个完全等价的概念
- F+ :为F所逻辑蕴涵的函数依赖的全体(定义6.12 )
- F+ :可以说成由F出发借助Armstrong公理导出的函数依赖的集合
- 定义6.14 如果G+=F+,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。
- 引理6.3 F+ = G+ 的充分必要条件是F Í G+和GÍ F+ 。
- 要判定F Í G+,只须逐一对F中的函数依赖X→Y,考察 Y 是否属于XG++ 就行了。因此引理6.3 给出了判断两个函数依赖集等价的可行算法。
- 定义6.15 如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集,亦称为最小依赖集或最小覆盖。
-
(1)单属性化: F中任一函数依赖的右部仅含有一个属性。
(2)无冗余化: F中不存在这样的函数依赖X→A, 使得F与F-{X→A}等价。
(3)既约化: F中不存在这样的函数依赖X→A, X有真子集Z使得F-{X→A}∪{Z→A}与F等价。
- 定理6.3 每一个函数依赖集F均等价于一个极小函数依赖集Fm。此Fm称为F的最小依赖集。
- 证:构造性证明,分三步对F进行“极小化处理”,找出F的一个最小依赖集。
-
(1)逐一检查F中各函数依赖FDi:X→Y,
若Y=A1A2 …Ak,k≥2,
则用{X→Aj | j=1,2,…,k}来取代X→Y。
引理6.1保证了F变换前后的等价性。
(2)逐一检查F中各函数依赖FDi:X→A,
令G=F-{X→A},
- AÎXG+,则从F中去掉此函数依赖。
- F与G 等价的充要条件是AÎXG+
-
(3)逐一取出F中各函数依赖FDi:X→A,
设X=B1B2…Bm,m≥2,
逐一考查Bi (i=1,2,…,m),
- A Î(X-Bi )F+,则以X-Bi 取代X。
-
由于F与F-{X→A}∪{Z→A}等价的充要条件是
- ÎZF+ ,其中Z=X-Bi ,因此F变换前后是等价的。
-
最后剩下的F就一定是极小依赖集。
因为对F的每一次“改造”都保证了改造前后的两个函数
依赖集等价,因此剩下的F与原来的F等价。
证毕
- 定理6.3的证明过程
- 是求F极小依赖集的过程
- 也是检验F是否为极小依赖集的一个算法
-
若改造后的F与原来的F相同,说明F就是一个最小依赖集
- F的最小依赖集Fm不一定是唯一的,它与对各函数依赖FDi 及X→A中X各属性的处置顺序有关。
- F = {A®B,B®A,A®C,B®C},求Fm。
- 检查A®B,G=F-{A®B}={B®A,A®C,B®C}
- ,C},BÏ{A,C}
-
- 检查A®C,G=F-{A®C}={A®B,B®A,B®C}
- ,B,C},CÎ{A,B,C}
- F中删除A®C,
- m = {A®B,B®A,B®C}
- Fm= {A®B,B®A,A®C}
- = {C®A,A®G,CG®B,B®A},求m。
-
F是无冗余的。
- CG®B,
- = = {G}
- Ï
-
- = = {C,A,G,B}
- Î ,以C代替CG
- Fm = {C®A,A®G,C®B,B®A}
- 在R<U,F>中可以用与F等价的依赖集G来取代F
- 原因:两个关系模式R1 <U,F>,R2<U,G>,如果F与G等价,那么R1的关系一定是R2的关系。反过来,R2的关系也一定是R1的关系。
-
、
- 把低一级的关系模式分解为若干个高一级的关系模式的方法不是唯一的
- 只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义
- 三种模式分解等价的定义:
- *6.4 模式的分解
-
⒈ 分解具有无损连接性⒉ 分解要保持函数依赖
⒊ 分解既要保持函数依赖,又要具有无损连接性
关系模式R<U,F>的一个分解:
ρ={ R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>}
- ∪Ui,且不存在 Ui Í Uj,Fi 为 F在 Ui 上的投影
- 6.17 函数依赖集合{X→Y | X→Y Î F+∧XY ÍUi} 的一个覆盖 Fi 叫作 F 在属性 Ui 上的投影
- R<U , F> , U = (A , B , C) , F = {A®B , B®C}可以有分解:
- , Æ > , R2<B , Æ > , R3<C , Æ >}
- , B},{A®B}> , R2<{A , C},{A®C}>}
- 关系模式R<U,F>的一个分解 ρ={ R1<U1,F1>,R2<U2,F2>, …,Rn<Un,Fn>}
-
若R与R1、R2、…、Rn自然连接的结果相等,则称关系模式R的这个分解ρ具有无损连接性(Lossless join)
- 具有无损连接性的分解保证不丢失信息
- 无损连接性不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题
-
将SL分解为下面二个关系模式:
ND(Sno, Sdept)
NL(Sno, Sloc)
第3种分解方法具有无损连接性
问题:这种分解方法没有保持原关系中的函数依赖
-
- SL中的函数依赖Sdept→Sloc没有投影到关系模式ND、NL上
- 设关系模式R<U,F>被分解为若干个关系模式
- R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>
- (其中U=U1∪U2∪…∪Un,且不存在Ui Í Uj,Fi为F在Ui上的投影),若F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖Fi所逻辑蕴含,则称关系模式R的这个分解是保持函数依赖的(Preserve dependency)
- . 将SL分解为下面二个关系模式:
- ND(Sno, Sdept)
- DL(Sdept, Sloc)
- 这种分解方法就保持了函数依赖
- 如果一个分解具有无损连接性,则它能够保证不丢失信息
- 如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况
- 分解具有无损连接性和分解保持函数依赖是两个互相独立的标准。具有无损连接性的分解不一定能够保持函数依赖;同样,保持函数依赖的分解也不一定具有无损连接性。
- 将SL分解为下面二个关系模式:
- ND(Sno, Sdept)
- DL(Sdept, Sloc)
- 这种分解方法就保持了函数依赖
- 第1种分解方法既不具有无损连接性,也未保持函数依赖,它不是原关系模式的一个等价分解
- 第2种分解方法未保持了函数依赖,不具有无损连接性
- 第3种分解方法具有无损连接性,但未保持函数依赖
- 第4种分解方法既具有无损连接性,又保持了函数依赖
- 算法6.2 判别一个分解的无损连接性
- 算法6.3(合成法)转换为3NF的保持函数依赖的分解。
- 算法6.4 转换为3NF既有无损连接性又保持函数依赖的分解
- 算法6.5 (分解法)转换为BCNF的无损连接分解
- 算法6.6 达到4NF的具有无损连接性的分解
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF。
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF。
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF。
- 定理
- U1ÇU2 ® U1(或U2),则r =∏U1(r) ∏U2(r) 。
-
-
- 一般定义
-
关系模式R<U , F> ,U = Ui ,
- = {R1<U1 , F1> , R2<U2 , F2>, … , Rn<Un , Fn>}是R<U , F>的一个分解,r是R<U , F>的一个关系。
- mr(r) = ∏Ri(r) ,若对于R<U , F>的任一个关系r,都有r = mr (r),则称r是R<U , F>的一个无损连接分解。
- 算法:(判别一个分解的无损连接性)
-
U={A1, A2, … , An}
- = {R1<U1 , F1> , R2<U2 , F2>, … , Rk<Uk , Fk>}
-
⒈建立一个n列k行的矩阵
- = {Cij | 若Aj Î Ui , Cij = aj , 否则Cij = bij}
- F中每一个函数依赖X®Y,若TB中存在元组 t1,t2,使得t1[X]=t2[X],t1[Y]≠t2[Y],则每一个Ai Î Y:
-
①若t1[Ai],t2[Ai]中有一个等于aj,则另一个也
改为aj ;
②若①不成立,则全部改为bmj,m是这些行的行号最小值。
反复执行⒉,直至:
①TB中出现一行为a1, a2 , … , an 的一行。
② TB不再发生变化,且没有一行为a1, … , an。
- ①情况下, r为无损分解,否则为有损分解
- 算法:(达到BCNF无损连接分解算法)
-
给定关系模式R<U , F> ,
- 令r = {R<U , F>}
- 检查r中各关系模式是否属于BCNF,若是,则 算法终止。
- 设r 中Ri<Ui , Fi>不属于BCNF,
- X®AÎ ,且X不是Ri的码,
- XA是Ri的真子集,将Ri分解为s={S1,S2},
- US1 = XA, US2 = Ui - {A}
- s代替Ri ,返回到⒉
- 算法:(达到4NF无损连接分解算法)
-
给定关系模式R<U , F> ,
- 令r = {R<U , F>}
- 检查r中各关系模式是否属于4NF,若是,则算法终止。
- 设r 中Ri<Ui , Fi>不属于4NF,
- X®®A,X不是Ri的码,
- XA是Ri的真子集,将Ri分解为s={S1,S2},
- US1 = XA, US2 = Ui - {A}
- s代替Ri ,返回到⒉
- 保持函数依赖的分解
- 定义
- F+ = ( È Fi)+, 则称R< U , F >的分解
- = {R1<U1 , F1> , … , Rn<Un , Fn>}保持函数依赖。
-
如表(职工,级别,工资)的分解,
分解一:(职工,工资),(工资,级别)
- ®级别
-
分解二:(职工,级别),(工资,级别)
保持函数依赖。
-
- 结论:若要求分解保持函数依赖,那么分解后的模式总可以达到3NF,但不一定能达到BCNF。
- 算法:(达到3NF且保持函数依赖的分解)
-
⒈求F的极小函数依赖集Fm 。
⒉找出不在Fm中出现的属性,将它们构成一个关 系模式,并从U中去掉它们(剩余属性仍记为U)。
- 若有X®AÎ Fm ,且XA=U,
-
则={R},算法终止。
- Fm按具有相同左部的原则进行分组(设为k组),每一组函数依赖所涉及的属性全体为Ui,若Ui Í Uj就去掉Ui。令Fi为Fm在Ui上的投影,则r = {R1<U1 , F1> , … , Rk<Uk , Fk>}是R<U , F>的一个保持函数依赖的分解,并且每个Ri<Ui , Fi> Î3NF。
- 算法:(达到3NF且同时保持无损连接与函数依赖的分解)
- r = {R1<U1 , F1> , … ,Rk<Uk , Fk>}是R<U , F>的一个保持函数依赖的3NF分解。
-
设X为R<U , F>的码,
- Ui,X Í Ui,则r即为所求,
- τ = r∪{R* <X,FX>},τ即为所求。
- 示例:
- R(ABC;A®C,B®C)的保持无损连接和函数依赖的3NF分解。
-
⒈按保持函数依赖分解
- r={{AC;A®C},{BC;B®C}}。
-
⒉码为AB
- = r∪{AB}
-
最后的分解为:
- ;A®C},{BC;B®C},{AB}}
-
小结
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF
- 规范化理论为数据库设计提供了理论的指南和工具
- 也仅仅是指南和工具
- 并不是规范化程度越高,模式就越好
- 必须结合应用环境和现实世界的具体情况合理地选择数据库模式
- 对如下的关系模式和函数依赖:
- R(A, B, C, D) 和B®C, B®D;
- R(A, B, C, D, E) 和AB®C,C®D,D ® B,D ®E;
-
做如下的事情:
1. 找出所有违反BCNF的依赖,包括不在上述集合中但可以由此推出的依赖。当然只要给出右边只含一个属性的依赖即可。
2. 找出所有违反3NF的依赖。
- 已知关系模式R的属性集合U={A,B,C,D,E},函数依赖集合
- ®C,B ®C,C ®D,DE ®C,CE ®A},
-
分解ρ={R1(A,D),R2(A,B),R3(B,E),R4(C,D,E),R5(A,E)}.是否具有无损连接性。
- 设F={AB®E,AC®F,AD®BF,B®C,C®D}, 证AC®F冗余。
-
第六章 关系数据理论
6.1 问题的提出
关系数据库逻辑设计
-
- 针对具体问题,如何构造一个适合于它的数据模式
- 数据库逻辑设计的工具──关系数据库的规范化理论
- 关系模式由五部分组成,是一个五元组:
R(U, D, DOM, F)- 关系名R是符号化的元组语义
- U为一组属性
- D为属性组U中的属性所来自的域
- DOM为属性到域的映射
- F为属性组U上的一组数据依赖
- 由于D、DOM与模式设计关系不大,因此在本章中把关系模式看作一个三元组:R<U,F>
- 当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系
- 作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)
- 一对一联系
- 设X,Y为关系中的属性或属性组,它们的所有可能取值组成两个集合。如果对于X中的任一具体值Y中至多有一个值与之对应,称X,Y这两个属性之间是一对一联系。
- 例:在读者关系中,借书证号是唯一的,如果读者没有重名的,姓名与借书证号两个属性之间是1:1联系。姓名可以确定借书证号,借书证号也可以确定姓名。
- 如果属性值集合X中的任一个具体值,至多与Y中的一个值相对应,而Y中的任一个具体值却可以和X中的多个值相对应,则称两个属性间从X到Y为m:1的联系或从Y到X是1:m的联系。
- 注意:这里指的是属性值个数的多少,而不是具有相同属性值的有多少个元组,二者正好相反。
- 例:在图书关系中,一本书有若干副本,它们有相同的书名、作者、分类号等,但每本书有唯一的总编号。书名与总编号之间是1:m,即同一个书名,有多个总编号与之对应。
- 在X,Y两个属性值集中,如果任一个值都可以至多和另一个属性值集中多个值对应,反之亦然,则称属性X和Y是m:n关系。
- 例:在借阅关系中,一个读者可以借多本书,即同一个借书证号有若干个图书总编号与之对应。由总编号标识的一本书在不同日期可以被不同的读者借阅。
- 数据依赖
- 是一个关系内部属性与属性之间的一种约束关系
- 通过属性间值的相等与否体现出来的数据间相互联系
- 是现实世界属性间相互联系的抽象
- 是数据内在的性质
- 是语义的体现
- 是一个关系内部属性与属性之间的一种约束关系
- 数据依赖的主要类型
- 函数依赖(Functional Dependency,简记为FD)
- 多值依赖(Multi-Valued Dependency,简记为MVD)
- 函数依赖普遍存在于现实生活中
- 描述一个学生关系,可以有学号、姓名、系名等属性。
- 一个学号只对应一个学生,一个学生只在一个系中学习
- “学号”值确定后,学生的姓名及所在系的值就被唯一确定。
- Sname=f(Sno),Sdept=f(Sno)
- 即Sno函数决定Sname
- Sno函数决定Sdept
- 记作Sno→Sname,Sno→Sdept
- 描述一个学生关系,可以有学号、姓名、系名等属性。
- [例6.1] 建立一个描述学校教务的数据库。
涉及的对象包括:- 学生的学号(Sno)
- 所在系(Sdept)
- 系主任姓名(Mname)
- 课程号(Cno)
- 成绩(Grade)
-
- 假设学校教务的数据库模式用一个单一的关系模式Student来表示,则该关系模式的属性集合为:
-
U ={Sno, Sdept, Mname, Cno, Grade}
-
- 现实世界的已知事实(语义):
- 一个系有若干学生, 但一个学生只属于一个系;
- 一个系只有一名(正职)负责人;
- 一个学生可以选修多门课程,每门课程有若干学生选修;
- 每个学生学习每一门课程有一个成绩。
- 由此可得到属性组U上的一组函数依赖F:
- 现实世界的已知事实(语义):
-
F={Sno→Sdept, Sdept→ Mname, (Sno, Cno)→ Grade}
关系模式Student<U, F>中存在的问题:
(1)数据冗余
-
- 浪费大量的存储空间
- 每一个系主任的姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。
- 浪费大量的存储空间
-
(2)更新异常(Update Anomalies)
-
- 数据冗余 ,更新数据时,维护数据完整性代价大。
- 某系更换系主任后,必须修改与该系学生有关的每一个元组。
- 数据冗余 ,更新数据时,维护数据完整性代价大。
-
(3)插入异常(Insertion Anomalies)
-
- 如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
-
(4)删除异常(Deletion Anomalies)
-
- 如果某个系的学生全部毕业了, 则在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
- 结论
- Student关系模式不是一个好的模式。
- 一个“好”的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽可能少。
- 原因
- 由存在于模式中的某些数据依赖引起的。
- 解决方法
- 用规范化理论改造关系模式来消除其中不合适的数据依赖
- 把这个单一的模式分成三个关系模式:
- S(Sno,Sdept,Sno → Sdept);
- SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
- DEPT(Sdept,Mname,Sdept → Mname);
- 这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。
- 问题:
- 插入异常:如果没有职工具有8级工资,则8级工资的工资数额就难以插入。
- 删除异常:如果仅有职工赵明具有4级工资,如果将赵明删除,则有关4级工资的工资数额信息也随之删除了。
- 数据冗余:职工很多,工资级别有限,每一级别的工资数额反复存储多次。
- 更新异常:如果将5级工资的工资数额调为1620,则需要找到每个具有5级工资的职工,逐一修改。
-
6.2 规范化
规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
6.2.1 函数依赖
1.函数依赖
2.平凡函数依赖与非平凡函数依赖
3.完全函数依赖与部分函数依赖
4.传递函数依赖
- 定义6.1 设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
- 函数依赖与属性间的联系类型有关
- (1) 一对一联系:X←→Y
- (2) 多对一联系:X→Y
- (3) 多对多联系:不存在依赖关系
-
(4) 可从属性间的联系类型来分析属性间的函数依赖
1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立
3. 数据库设计者可以对现实世界作强制的规定。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在, 则拒绝装入该元组。
- 由下面的关系表, 能否得出Sno → Sname
-
函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件
- 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。
- 在R(U)中,如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖,记作X → Y。
- 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X → Y
- 在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 码
- 设K为R<U,F>中的属性或属性组合。若K → U,则K称为R的一个候选码(Candidate Key)。
- 如果U部分函数依赖于K,即K → U,则K称为超码 (Surpkey)。候选码是最小的超码,即K的任意一个真子集都不是候选码。
- 若关系模式R有多个候选码,则选定其中的一个做为主码(Primary key)。
- 主属性与非主属性
- 包含在任何一个候选码中的属性 ,称为主属性 (Prime attribute)
- 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
- 全码:整个属性组是码,称为全码(All-key)
- 关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码。
- SC(Sno,Cno,Grade)中,Sno不是码
- Sno是 S(Sno,Sdept,Sage)的码,则Sno是SC的外码
-
主码与外部码一起提供了表示关系间联系的手段
关系模式S(S# , SN , SD , DEAN , C# , G)
主码:(S#,C#)
函数依赖:
(S#,C#) G
- ® SN,(S#,C#) SN
- ® SD,(S#,C#) SD
- ® DEAN, S# ® DEAN
-
(S#,C#) DEAN
6.2.3 范式
- 范式是符合某一种级别的关系模式的集合。
- 关系数据库中的关系必须满足一定的要求。满足 不同程度要求的为不同范式。
- 范式的种类:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- BC范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF)
- 各种范式之间存在联系:
- 某一关系模式R为第n范式,可简记为R∈nNF。
- 一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(normalization)。
-
6.2.4 2NF
- 定义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
-
- 一个关系模式不属于2NF,会产生以下问题:
- 插入异常
- 如果插入一个新学生,但该生未选课,即该生无Cno,由于插入元组时,必须给定码值,因此插入失败。
- 删除异常
- 如果S4只选了一门课C3,现在他不再选这门课,则删除C3后,整个元组的其他信息也被删除了。
- 修改复杂
- 如果一个学生选了多门课,则Sdept,Sloc被存储了多次。如果该生转系,则需要修改所有相关的Sdept和Sloc,造成修改的复杂化。
- 插入异常
- 出现这种问题的原因
- 例子中有两类非主属性:
- 一类如Grade,它对码完全函数依赖
- 另一类如Sdept、Sloc,它们对码不是完全函数依赖
- 例子中有两类非主属性:
- 解决方法:
- 用投影分解把关系模式S-L-C分解成两个关系模式
- SC(Sno,Cno,Grade)
- S-L(Sno,Sdept,Sloc)
- SC的码为(Sno,Cno),SL的码为Sno,这样使得非主属性对码都是完全函数依赖了
- 用投影分解把关系模式S-L-C分解成两个关系模式
-
6.2.5 3NF
- 设关系模式R<U,F>∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Z ⊇ Y), 使得X→Y,Y→Z成立,Y ↛ X不成立,则称R<U,F> ∈ 3NF。
-
SC没有传递依赖,因此SC ∈ 3NF
- 不良特性
- 插入异常:如果系中没有学生,则有关系的信息就无法插入。
- 删除异常:如果学生全部毕业了,则在删除学生信息的同时有关系的信息也随之删除了。
- 更新异常:如果学生转系,不但要修改SDept,还要修改Sloc,如果换Sloc,则该系每个学生元组都要做相应修改。
- 数据冗余:每个学生都存储了所在系的Sloc的信息。
- 解决方法
-
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D(Sno, Sdept)
D-L(Sdept,Sloc)
S-D的码为Sno, D-L的码为Sdept。
-
- 分解后的关系模式S-D与D-L中不再存在传递依赖
- 说明
-
(1) 每个非主属性既不部分依赖,也不传递依赖于R的任何码。
(2) 从1NF→2NF:消除非主属性对码的部分函数依赖
(3) 从2NF→3NF:消除非主属性对码的传递函数依赖
(4) 从一个表中删去不依赖于主码的数据列。
6.2.6 BCNF
- BCNF(Boyce Codd Normal Form)由Boyce和Codd提出,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
- 定义6.8 设关系模式R<U,F>∈1NF,若X →Y且Y ⊆ X时X必含有码,则R<U,F>∈BCNF。
- 换言之,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。
- 不良特性
- 插入异常:如果没有学生选修某位老师的任课,则该老师担任课程的信息就无法插入。
- 删除异常:删除学生选课信息,会删除掉老师的任课信息。
- 更新异常:如果老师所教授的课程有所改动,则所有选修该老师课程的学生元组都要做改动。
- 数据冗余:每位学生都存储了有关老师所教授的课程的信息。
- 症由:
-
主属性对码的不良依赖。
- 非BCNF的关系模式也可以通过分解成为BCNF。例如STJ可分解为ST(S,T)与TJ(T,J),它们都是BCNF。
- 没有任何属性对码的部分函数依赖和传递函数依赖
- 3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的测度。
- 一个模式中的关系模式如果都属于BCNF,那么在函数依赖范畴内,它已实现了彻底的分离,已消除了插入和删除的异常。
- 3NF的“不彻底”性表现在可能存在主属性对码的部分依赖和传递依赖。
- ⒈ 所有非主属性都完全函数依赖于每个候选码
- ⒉ 所有主属性都完全函数依赖于每个不包含它的候选码
- ⒊ 没有任何属性完全函数依赖于非码的任何一组属性
-
6.2.7 多值依赖
- Teaching具有唯一候选码(C,T,B), 即全码。
- Teaching∈BCNF
- 设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
- 例 Teaching(C, T, B)
-
对于C的每一个值,T有一组值与之对应,而不论
B取何值。因此T多值依赖于C,即C→→T。
- 多值依赖的另一个等价的定义
-
在R(U)的任一关系r中,如果存在元组t,s使得t[X]=s[X]
,那么就必然存在元组w,v∈r,(w,v可以与s,t相
同), 使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],
v[Y]=s[Y],v[Z]=t[Z](即交换s,t元组的Y值所得的两
个新元组必在r中则Y多值依赖于X,记为X→→Y。这里
X,Y是U的子集,Z=U-X-Y。
- 平凡多值依赖和非平凡的多值依赖
- 若X→→Y,而Z=Ф,即Z为空,则称X→→Y为平凡的多值依赖。
- 否则称X→→Y为非平凡的多值依赖。
- 找出关系上所满足的多值依赖。
-
- ®®C
- ®®A
- C®®B?若使B®®C成立,需加入哪些元组?
- 按照语义对于W的每一个值Wi,S有一个完整的集合与之对应而不问C取何值。所以W→→S。
- 如图6.7所示
- 对应W的某一个值Wi的全部S值记作{S}Wi(表示此仓库工作的全部保管员)
- 全部C值记作{C}Wi(表示在此仓库中存放的所有商品)
- 应当有{S}Wi中的每一个值和{C}Wi中的每一个C值对应
- 于是{S}Wi与{C}Wi之间正好形成一个完全二分图,因而W→→S。
- 由于C与S的完全对称性,必然有W→→C成立。
-
- 多值依赖的性质
-
(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。
- 多值依赖与函数依赖的区别
-
(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
- 关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R<U,F>∈4NF。
- 不允许有非平凡且非函数依赖的多值依赖。
- 允许的非平凡多值依赖实际上是函数依赖。
- 6.2.9 规范化小结
- 在关系数据库中,对关系模式的基本要求是满足第一范式。
- 规范化程度过低的关系不一定能够很好地描述现实世界
- 可能存在插入异常、删除异常、修改复杂、数据冗余等问题
-
解决方法就是对其进行规范化,转换成高级范式。
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化。
- 关系数据库的规范化理论是数据库逻辑设计的工具。
- 规范化的基本思想
- 是逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”。
- 即采用“一事一地”的模式设计原则
- 让一个关系描述一个概念、一个实体或者实体间的一种联系。
- 若多于一个概念就把它“分离”出去。
- 因此 规范化实质上是概念的单一化。
-
关系模式规范化的基本步骤
1NF
↓ 消除非主属性对码的部分函数依赖
消除决定因素 2NF
非码的非平凡 ↓ 消除非主属性对码的传递函数依赖
函数依赖 3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF
- 不能说规范化程度越高的关系模式就越好。
- 必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。
- 上面的规范化步骤可以在其中任何一步终止。
-
6.3 数据依赖的公理系统
- 定义6.11 对于满足一组函数依赖F的关系模式 R <U,F>,其任何一个关系r,若函数依赖X→Y都成立(即r中任意两元组t、s,若t[X]=s[X],则 t[Y]=s[Y]),则称F逻辑蕴涵X →Y。
- Armstrong公理系统
- 一套推理规则,是模式分解算法的理论基础
- 用途
- 求给定关系模式的码
- 从一组函数依赖求得蕴涵的函数依赖
- Armstrong公理系统 设U为属性集总体,F是U上的一组函数依赖, 于是有关系模式R <U,F >。对R <U,F> 来说有以下的推理规则:
- A1 自反律(reflexivity rule):若Y Í X Í U,则X →Y 为F所蕴涵。
- A2 增广律(augmentation rule):若X→Y为F所蕴涵,且Z Í U,则XZ→YZ 为F所蕴涵。
- A3 传递律(transitivity rule):若X→Y及Y→Z为F所蕴涵,则X→Z 为F所蕴涵。
-
注意:由自反律所得到的函数依赖均是平凡的函数依赖,
自反律的使用并不依赖于F。
- 根据A1,A2,A3这三条推理规则可以得到下面三条推理规则:
- 合并规则(union rule):
-
由X→Y,X→Z,有X→YZ。
-
- 伪传递规则(pseudo transitivity rule):
-
由X→Y,WY→Z,有XW→Z。
-
- 分解规则(decomposition rule):
- X→Y及ZÍY,有X→Z。
- 根据合并规则和分解规则,可得引理6.1
- 引理6.1 X→A1 A2…Ak成立的充分必要条件是X→Ai成立(i=1,2,…,k)。
- 定义6.12 在关系模式R<U,F>中为F所逻辑蕴涵的函数依赖的全体叫作F的闭包,记为F +。
- 定义6.13 设F为属性集U上的一组函数依赖,X、Y ÍU, XF+={ A|X→A能由F根据Armstrong公理导出},XF+称为属性集X关于函数依赖集F的闭包。
- 引理6.2 设F为属性集U上的一组函数依赖,X、Y Í U,X→Y能由F根据Armstrong公理导出的充分必要条件是Y ÍXF+。
- 引理6.2的用途
-
判定X→Y是否能由F根据Armstrong公理导出的问题,就
转化为求出XF+,判定Y是否为XF+的子集的问题。
- 求闭包的算法
- 算法6.1 求属性集X(X Í U)关于U上的函数依赖集F的闭包XF+
- 输入:X,F
- 输出:XF+
- 步骤:
- 令X(0)=X,i=0
- 求B,这里B ={ A |($ V)( $ W)(V→WÎF
- V Í X(i)AÎ W)}。
- X(i+1)=B∪X(i) 。
- 判断X(i+1)= X(i) 。
- 若X(i+1)与X(i)相等或X(i)=U ,则X(i)就是XF+,
-
算法终止。
- 若否,则i=i+1,返回第②步。
-
对于算法6.1, 令ai =|X(i)|,{ai }形成一个步长大于1的严格递增的序列,序列的上界是 | U |,因此该算法最多 |U| - |X| 次循环就
会终止。
-
- 由引理二,判定X®Y是否能由F根据Armstrong公理导出,可转化为求 ,判定YÍ 是否成立。
-
输入:X,F
输出:
1) := X;
- )考察每个F中的函数依赖 A®B,
- A Í ,则 := ÈB
-
3)继续考察,直到 不再增大为止。
- 函数依赖集的等价变换
- 例:r是关系模式R(A, B, C)上的一个关系,用SQL检测在r上是否满足函数依赖B ® C。
-
- 有效性与完备性的含义
- 有效性:由F 出发根据Armstrong公理推导出来的每一个函数依赖一定在F +中
- 完备性:F +中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来
- Armstrong公理的完备性及有效性说明:
- “导出”与“蕴涵”是两个完全等价的概念
- F+ :为F所逻辑蕴涵的函数依赖的全体(定义6.12 )
- F+ :可以说成由F出发借助Armstrong公理导出的函数依赖的集合
- 定义6.14 如果G+=F+,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。
- 引理6.3 F+ = G+ 的充分必要条件是F Í G+和GÍ F+ 。
- 要判定F Í G+,只须逐一对F中的函数依赖X→Y,考察 Y 是否属于XG++ 就行了。因此引理6.3 给出了判断两个函数依赖集等价的可行算法。
- 定义6.15 如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集,亦称为最小依赖集或最小覆盖。
-
(1)单属性化: F中任一函数依赖的右部仅含有一个属性。
(2)无冗余化: F中不存在这样的函数依赖X→A, 使得F与F-{X→A}等价。
(3)既约化: F中不存在这样的函数依赖X→A, X有真子集Z使得F-{X→A}∪{Z→A}与F等价。
- 定理6.3 每一个函数依赖集F均等价于一个极小函数依赖集Fm。此Fm称为F的最小依赖集。
- 证:构造性证明,分三步对F进行“极小化处理”,找出F的一个最小依赖集。
-
(1)逐一检查F中各函数依赖FDi:X→Y,
若Y=A1A2 …Ak,k≥2,
则用{X→Aj | j=1,2,…,k}来取代X→Y。
引理6.1保证了F变换前后的等价性。
(2)逐一检查F中各函数依赖FDi:X→A,
令G=F-{X→A},
- AÎXG+,则从F中去掉此函数依赖。
- F与G 等价的充要条件是AÎXG+
-
(3)逐一取出F中各函数依赖FDi:X→A,
设X=B1B2…Bm,m≥2,
逐一考查Bi (i=1,2,…,m),
- A Î(X-Bi )F+,则以X-Bi 取代X。
-
由于F与F-{X→A}∪{Z→A}等价的充要条件是
- ÎZF+ ,其中Z=X-Bi ,因此F变换前后是等价的。
-
最后剩下的F就一定是极小依赖集。
因为对F的每一次“改造”都保证了改造前后的两个函数
依赖集等价,因此剩下的F与原来的F等价。
证毕
- 定理6.3的证明过程
- 是求F极小依赖集的过程
- 也是检验F是否为极小依赖集的一个算法
-
若改造后的F与原来的F相同,说明F就是一个最小依赖集
- F的最小依赖集Fm不一定是唯一的,它与对各函数依赖FDi 及X→A中X各属性的处置顺序有关。
- F = {A®B,B®A,A®C,B®C},求Fm。
- 检查A®B,G=F-{A®B}={B®A,A®C,B®C}
- ,C},BÏ{A,C}
-
- 检查A®C,G=F-{A®C}={A®B,B®A,B®C}
- ,B,C},CÎ{A,B,C}
- F中删除A®C,
- m = {A®B,B®A,B®C}
- Fm= {A®B,B®A,A®C}
- = {C®A,A®G,CG®B,B®A},求m。
-
F是无冗余的。
- CG®B,
- = = {G}
- Ï
-
- = = {C,A,G,B}
- Î ,以C代替CG
- Fm = {C®A,A®G,C®B,B®A}
- 在R<U,F>中可以用与F等价的依赖集G来取代F
- 原因:两个关系模式R1 <U,F>,R2<U,G>,如果F与G等价,那么R1的关系一定是R2的关系。反过来,R2的关系也一定是R1的关系。
-
、
- 把低一级的关系模式分解为若干个高一级的关系模式的方法不是唯一的
- 只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义
- 三种模式分解等价的定义:
- *6.4 模式的分解
-
⒈ 分解具有无损连接性⒉ 分解要保持函数依赖
⒊ 分解既要保持函数依赖,又要具有无损连接性
关系模式R<U,F>的一个分解:
ρ={ R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>}
- ∪Ui,且不存在 Ui Í Uj,Fi 为 F在 Ui 上的投影
- 6.17 函数依赖集合{X→Y | X→Y Î F+∧XY ÍUi} 的一个覆盖 Fi 叫作 F 在属性 Ui 上的投影
- R<U , F> , U = (A , B , C) , F = {A®B , B®C}可以有分解:
- , Æ > , R2<B , Æ > , R3<C , Æ >}
- , B},{A®B}> , R2<{A , C},{A®C}>}
- 关系模式R<U,F>的一个分解 ρ={ R1<U1,F1>,R2<U2,F2>, …,Rn<Un,Fn>}
-
若R与R1、R2、…、Rn自然连接的结果相等,则称关系模式R的这个分解ρ具有无损连接性(Lossless join)
- 具有无损连接性的分解保证不丢失信息
- 无损连接性不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题
-
将SL分解为下面二个关系模式:
ND(Sno, Sdept)
NL(Sno, Sloc)
第3种分解方法具有无损连接性
问题:这种分解方法没有保持原关系中的函数依赖
-
- SL中的函数依赖Sdept→Sloc没有投影到关系模式ND、NL上
- 设关系模式R<U,F>被分解为若干个关系模式
- R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>
- (其中U=U1∪U2∪…∪Un,且不存在Ui Í Uj,Fi为F在Ui上的投影),若F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖Fi所逻辑蕴含,则称关系模式R的这个分解是保持函数依赖的(Preserve dependency)
- . 将SL分解为下面二个关系模式:
- ND(Sno, Sdept)
- DL(Sdept, Sloc)
- 这种分解方法就保持了函数依赖
- 如果一个分解具有无损连接性,则它能够保证不丢失信息
- 如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况
- 分解具有无损连接性和分解保持函数依赖是两个互相独立的标准。具有无损连接性的分解不一定能够保持函数依赖;同样,保持函数依赖的分解也不一定具有无损连接性。
- 将SL分解为下面二个关系模式:
- ND(Sno, Sdept)
- DL(Sdept, Sloc)
- 这种分解方法就保持了函数依赖
- 第1种分解方法既不具有无损连接性,也未保持函数依赖,它不是原关系模式的一个等价分解
- 第2种分解方法未保持了函数依赖,不具有无损连接性
- 第3种分解方法具有无损连接性,但未保持函数依赖
- 第4种分解方法既具有无损连接性,又保持了函数依赖
- 算法6.2 判别一个分解的无损连接性
- 算法6.3(合成法)转换为3NF的保持函数依赖的分解。
- 算法6.4 转换为3NF既有无损连接性又保持函数依赖的分解
- 算法6.5 (分解法)转换为BCNF的无损连接分解
- 算法6.6 达到4NF的具有无损连接性的分解
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF。
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF。
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF。
- 定理
- U1ÇU2 ® U1(或U2),则r =∏U1(r) ∏U2(r) 。
-
-
- 一般定义
-
关系模式R<U , F> ,U = Ui ,
- = {R1<U1 , F1> , R2<U2 , F2>, … , Rn<Un , Fn>}是R<U , F>的一个分解,r是R<U , F>的一个关系。
- mr(r) = ∏Ri(r) ,若对于R<U , F>的任一个关系r,都有r = mr (r),则称r是R<U , F>的一个无损连接分解。
- 算法:(判别一个分解的无损连接性)
-
U={A1, A2, … , An}
- = {R1<U1 , F1> , R2<U2 , F2>, … , Rk<Uk , Fk>}
-
⒈建立一个n列k行的矩阵
- = {Cij | 若Aj Î Ui , Cij = aj , 否则Cij = bij}
- F中每一个函数依赖X®Y,若TB中存在元组 t1,t2,使得t1[X]=t2[X],t1[Y]≠t2[Y],则每一个Ai Î Y:
-
①若t1[Ai],t2[Ai]中有一个等于aj,则另一个也
改为aj ;
②若①不成立,则全部改为bmj,m是这些行的行号最小值。
反复执行⒉,直至:
①TB中出现一行为a1, a2 , … , an 的一行。
② TB不再发生变化,且没有一行为a1, … , an。
- ①情况下, r为无损分解,否则为有损分解
- 算法:(达到BCNF无损连接分解算法)
-
给定关系模式R<U , F> ,
- 令r = {R<U , F>}
- 检查r中各关系模式是否属于BCNF,若是,则 算法终止。
- 设r 中Ri<Ui , Fi>不属于BCNF,
- X®AÎ ,且X不是Ri的码,
- XA是Ri的真子集,将Ri分解为s={S1,S2},
- US1 = XA, US2 = Ui - {A}
- s代替Ri ,返回到⒉
- 算法:(达到4NF无损连接分解算法)
-
给定关系模式R<U , F> ,
- 令r = {R<U , F>}
- 检查r中各关系模式是否属于4NF,若是,则算法终止。
- 设r 中Ri<Ui , Fi>不属于4NF,
- X®®A,X不是Ri的码,
- XA是Ri的真子集,将Ri分解为s={S1,S2},
- US1 = XA, US2 = Ui - {A}
- s代替Ri ,返回到⒉
- 保持函数依赖的分解
- 定义
- F+ = ( È Fi)+, 则称R< U , F >的分解
- = {R1<U1 , F1> , … , Rn<Un , Fn>}保持函数依赖。
-
如表(职工,级别,工资)的分解,
分解一:(职工,工资),(工资,级别)
- ®级别
-
分解二:(职工,级别),(工资,级别)
保持函数依赖。
-
- 结论:若要求分解保持函数依赖,那么分解后的模式总可以达到3NF,但不一定能达到BCNF。
- 算法:(达到3NF且保持函数依赖的分解)
-
⒈求F的极小函数依赖集Fm 。
⒉找出不在Fm中出现的属性,将它们构成一个关 系模式,并从U中去掉它们(剩余属性仍记为U)。
- 若有X®AÎ Fm ,且XA=U,
-
则={R},算法终止。
- Fm按具有相同左部的原则进行分组(设为k组),每一组函数依赖所涉及的属性全体为Ui,若Ui Í Uj就去掉Ui。令Fi为Fm在Ui上的投影,则r = {R1<U1 , F1> , … , Rk<Uk , Fk>}是R<U , F>的一个保持函数依赖的分解,并且每个Ri<Ui , Fi> Î3NF。
- 算法:(达到3NF且同时保持无损连接与函数依赖的分解)
- r = {R1<U1 , F1> , … ,Rk<Uk , Fk>}是R<U , F>的一个保持函数依赖的3NF分解。
-
设X为R<U , F>的码,
- Ui,X Í Ui,则r即为所求,
- τ = r∪{R* <X,FX>},τ即为所求。
- 示例:
- R(ABC;A®C,B®C)的保持无损连接和函数依赖的3NF分解。
-
⒈按保持函数依赖分解
- r={{AC;A®C},{BC;B®C}}。
-
⒉码为AB
- = r∪{AB}
-
最后的分解为:
- ;A®C},{BC;B®C},{AB}}
-
小结
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF
- 规范化理论为数据库设计提供了理论的指南和工具
- 也仅仅是指南和工具
- 并不是规范化程度越高,模式就越好
- 必须结合应用环境和现实世界的具体情况合理地选择数据库模式
- 对如下的关系模式和函数依赖:
- R(A, B, C, D) 和B®C, B®D;
- R(A, B, C, D, E) 和AB®C,C®D,D ® B,D ®E;
-
做如下的事情:
1. 找出所有违反BCNF的依赖,包括不在上述集合中但可以由此推出的依赖。当然只要给出右边只含一个属性的依赖即可。
2. 找出所有违反3NF的依赖。
- 已知关系模式R的属性集合U={A,B,C,D,E},函数依赖集合
- ®C,B ®C,C ®D,DE ®C,CE ®A},
-
分解ρ={R1(A,D),R2(A,B),R3(B,E),R4(C,D,E),R5(A,E)}.是否具有无损连接性。
- 设F={AB®E,AC®F,AD®BF,B®C,C®D}, 证AC®F冗余。
-
因此F变换前后是等价的。
因此F变换前后是等价的。
设X为R<U , F>的码,
- Ui,X Í Ui,则r即为所求,
- τ = r∪{R* <X,FX>},τ即为所求。
- 示例:
- R(ABC;A®C,B®C)的保持无损连接和函数依赖的3NF分解。
-
⒈按保持函数依赖分解
- r={{AC;A®C},{BC;B®C}}。
-
⒉码为AB
- = r∪{AB}
-
最后的分解为:
- ;A®C},{BC;B®C},{AB}}
-
小结
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF
- 规范化理论为数据库设计提供了理论的指南和工具
- 也仅仅是指南和工具
- 并不是规范化程度越高,模式就越好
- 必须结合应用环境和现实世界的具体情况合理地选择数据库模式
- 对如下的关系模式和函数依赖:
- R(A, B, C, D) 和B®C, B®D;
- R(A, B, C, D, E) 和AB®C,C®D,D ® B,D ®E;
-
做如下的事情:
1. 找出所有违反BCNF的依赖,包括不在上述集合中但可以由此推出的依赖。当然只要给出右边只含一个属性的依赖即可。
2. 找出所有违反3NF的依赖。
- 已知关系模式R的属性集合U={A,B,C,D,E},函数依赖集合
- ®C,B ®C,C ®D,DE ®C,CE ®A},
-
分解ρ={R1(A,D),R2(A,B),R3(B,E),R4(C,D,E),R5(A,E)}.是否具有无损连接性。
- 设F={AB®E,AC®F,AD®BF,B®C,C®D}, 证AC®F冗余。
-
- 并不是规范化程度越高,模式就越好
- 必须结合应用环境和现实世界的具体情况合理地选择数据库模式
- 对如下的关系模式和函数依赖:
- R(A, B, C, D) 和B®C, B®D;
- R(A, B, C, D, E) 和AB®C,C®D,D ® B,D ®E;
做如下的事情:
1. 找出所有违反BCNF的依赖,包括不在上述集合中但可以由此推出的依赖。当然只要给出右边只含一个属性的依赖即可。
2. 找出所有违反3NF的依赖。
- 已知关系模式R的属性集合U={A,B,C,D,E},函数依赖集合
- ®C,B ®C,C ®D,DE ®C,CE ®A},
分解ρ={R1(A,D),R2(A,B),R3(B,E),R4(C,D,E),R5(A,E)}.是否具有无损连接性。
- 设F={AB®E,AC®F,AD®BF,B®C,C®D}, 证AC®F冗余。