数据库--关系数据理论
第二篇 设计与应用开发篇
基于某个数据库管理系统设计数据库,如何基于数据库系统编程
- 关系数据理论
- 数据库设计
- 数据库编程
关系模式由五部分组成,是一个五元组:R(U, D, DOM, F)
- 关系名R是符号化的元组语义
- U为一组属性
- D为属性组U中的属性所来自的域
- DOM为属性到域的映射
- F为属性组U上的一组数据依赖
由于D、DOM与模式设计关系不大,
因此在本章中把关系模式看作一个三元组:R<U,F>.
当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系
函数依赖
数据依赖
- 是一个关系内部属性与属性之间的一种约束关系
通过属性间值的相等与否体现出来的数据间相互联系 - 是现实世界属性间相互联系的抽象
- 是数据内在的性质
- 是语义的体现
数据依赖的主要类型
- 函数依赖(Functional Dependency,简记为FD)
- 多值依赖(Multi-Valued Dependency,简记为MVD)
函数依赖
设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,
r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等,(也就是说Y上不等,X上一定不等,一个X确定一个Y)
则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
其实称X为决定因素
分类:
- X→Y,但Y⊈X则称X→Y是非平凡的函数依赖。
- X→Y,但Y⊆X 则称X→Y是平凡的函数依赖。
对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。
若不特别声明, 我们总是讨论非平凡函数依赖。
- 完全函数依赖:形成依赖的最小的集合。 如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖。(F)
- 部分完全依赖: 不是完全函数依赖的函数依赖(参数的子集可以就确定)。(P)
- 传递函数依赖:x->y(Y⊈X,y->x不成立), y->z(Z⊈Y) 则x---z(z对x传递函数依赖)
(Y⊈X,y->x不成立)和(Z⊈Y)用于保证是x,y,z三个独立的变量
码
设K为R<U,F>中的属性或属性组合。若U完全函数依赖于K,则K称为R的一个候选码
如果U部分函数依赖于K,即K → U,则K称为超码
候选码是最小的超码,即K的任意一个真子集都不是候选码。
若关系模式R有多个候选码,则选定其中的一个做为主码(Primary key)。
整个属性组是码(主码),称为全码
属性与非主属性****
包含在任何一个候选码中的属性 ,称为主属性
不包含在任何码中的属性称为非主属
关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码/外码。
- SC(Sno,Cno,Grade)中,Sno不是码.
- Sno是 S(Sno,Sdept,Sage)的码,则Sno是SC的外码.
范式
范式是符合某一种级别的关系模式的集合。
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
分为第一范式(1NF)到第五范式(5NF)。
理论上最好优化到5NF , 实际上优化到3范式
各种范式之间存在联系:
某一关系模式R为第n范式,可简记为R∈nNF。
一个低一级范式的关系模式,通过模式分解,可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化
一范式
满足所有关系不可再分
二范式
若关系模式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
非主属性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,这样使得非主属性对码都是完全函数依赖了
3NF
设关系模式R<U,F>∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Z ⊇ Y), 使得X→Y,Y→Z成立,Y ↛ X不成立,则称R<U,F> ∈ 3NF。
即:满足二范式的基础上,消除非主属性对主属性的传递依赖。
S-L中Sno →Sdept( Sdept ↛ Sno), Sdept→Sloc,可得Sloc传递依赖于Sno。
BCNF
(Boyce Codd Normal Form)由Boyce和Codd提出,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
设关系模式R<U,F>∈1NF,若X →Y且Y ⊆ X时X必含有码,则R<U,F>∈BCNF。
换言之,在关系模式R<U,F>中,如果每一个主属性集都包含候选码,则R∈BCNF。
即:在满足三范式的基础上,让每一个决定因素都包含码
BCNF的关系模式所具有的性质
- 所有非主属性都完全函数依赖于每个候选码
- 所有主属性都完全函数依赖于每个不包含它的候选码
- 没有任何属性完全函数依赖于非码的任何一组属性
如果一个关系数据库中的所有关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了插入异常和删除异常。
。
[例6.7] 关系模式SJP(S,J,P)中,S是学生,J表示 课程,P表示名次。
每一个学生选修每门课程的成绩有一定的名次,每门课程中每一名次只有一个学生(即没有并列名次)。
由语义可得到函数依赖: (S,J)→P;(J,P)→S
(S,J)与(J,P)都可以作为候选码。
关系模式中没有属性对码传递依赖或部分依赖,所以 SJP∈3NF。
除(S,J)与(J,P)以外没有其他决定因素,所以 SJP∈BCNF。
[例6.7] [例6.8] 关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。
每一教师只教一门课。每门课有若干教师,某一学生选定某门课,就对应一个固定的教师。
由语义可得到函数依赖:(S,J)→T;(S,T)→J;T→J
因为没有任何非主属性对码传递依赖或部分依赖, STJ ∈ 3NF。
因为T是决定因素,而T不包含码,所以STJ 不属于 BCNF关系。
多值依赖
设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。
当且仅当
- 对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,
- 这组值仅仅决定于x值而与z值无关。
称关系模式R(U)中多值依赖X→→Y成立,记为X→→Y
例 Teaching(C, T, B)
对于C的每一个值,T有一组值与之对应,而不论
B取何值。因此T多值依赖于C,即C→→T。
平凡多值依赖和非平凡的多值依赖
- 若X→→Y,而Z=Ф,即Z为空,则称X→→Y为平凡的多值依赖。
- 否则称X→→Y为非平凡的多值依赖。
平凡的函数依赖:如果A->B 并且 B是A的一部分
[例6.10]关系模式WSC(W,S,C)中,W表示仓库,S 表示保管
员,C 表示商品。假设每个仓库有若干个保管员,有若干种
商品。每个保管员保管所在仓库的所有商品,每种商品被所
有保管员保管。
按照语义对于W的每一个值Wi,S有一个完整的集合与之对应而不问C取何值。所以W→→S。
如图所示
对应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 -
(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。
多值依赖与函数依赖的区别
- 多值依赖的有效性与属性集的范围有关
- 若函数依赖X→Y在R (U)上成立,则对于任何Y‘ 属于 Y均有X→Y’ 成立。多值依赖X→→Y若在R(U)上成立,不能断言对于任何Y’属于Y有X→→Y’ 成立。
例如,关系R(A,B,C,D),A→→BC成立,当然也有A→→D成立。有R的一个关系实例,在此实例上A→→B是不成立的。
表6.6 R的一个实例
四范式
关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R<U,F>∈4NF。
即;在满足三范式的基础上,消除非平凡且非函数依赖的多值依赖
4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。
4NF所允许的非平凡多值依赖实际上是函数依赖。
全码:只有所有属性能做主码。
- 如果满足全码,则一定满足BCNF范式。
下表符合BCNF和全码:
出现的问题:重复太多;即出现了多值依赖
规范化小结
规范化过程
数据依赖的公理系统
定义6.11 对于满足一组函数依赖F的关系模式 R <U,F>,其任何一个关系r,若函数依赖X→Y都成立(即r中任意两元组t、s,若t[X]=s[X],则 t[Y]=s[Y]),则称F逻辑蕴涵X →Y。
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及ZY,有X→Z。
2 在关系模式R<U,F>中为F所逻辑蕴涵的函数依赖的全体叫作F的闭包,记为\(F^+\)。
设F为属性集U上的一组函数依赖,X、Y U, \(X_F^+\)={ A|X→A能由F根据Armstrong公理导出},XF+称为属性集X关于函数依赖集F的闭包。