关系数据理论
问题的提出
关系模式可以表示为R(U,D,DOM,F) 在研究关系数据理论时,可以简化为R(U,F)
U是一组属性,F是数据依赖
数据依赖是一个关系内部属性与属性之间的一种约束关系。函数依赖和多值依赖是两种重要的数据依赖
第一范式要求关系模式的二维表的每一个分量均为不可分割的数据项。第一范式存在以下问题:
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
下面以Student表为例,解释第一范式为何存在以上问题
Sno | Sdept | Mname | Cno | Grade |
---|---|---|---|---|
2017133 | CSSE | DR.CHEN | C1 | 100 |
数据冗余:每个系的系主任名字相同,在该数据模式中大量出现,将导致大量空间的浪费
更新异常:当要改变系主任的名字时,将对所有该系的元组进行更改,很容易出错
插入异常:当要创建一个新的系,该系尚未有学生就读,将无法插入该关系模式中
删除异常:当某个系的学生全部毕业了,意味着要删除所有该系的元组,这会导致该系也消失,这不符合常理
一个好的关系模式是不应该存在更新异常,插入异常和删除异常的,同时还应该尽可能地减少数据冗余。那么怎么设计一个好的关系模式呢?
规范化
函数依赖的分类
-
非平凡函数依赖 X->Y ,Y不包含于X
-
平凡函数依赖X->Y,Y包含于X
-
X又称为决定因素
-
在关系模式R(U)中,若X->Y且对于X的任何一个真子集X‘,均无法得到X’->Y,则称Y对X完全函数依赖。相反地,则称Y对X的部分函数依赖。
-
传递函数依赖:X->Y,Y不包含于X,Y->X不成立,Y->Z,Z不包含与Y,则X->Z(Z对X的传递函数依赖)
码的概念
主码,超码,候选码的概念
若关系模式U完全依赖于K,则称K为候选码
若关系模式U依赖于K,则称K为超码
在超码中选择一个作为主码
包含在任何一个候选码中的属性称为主属性,反之则称为非主属性
极端情况,整个属性组是候选码,则称为全码
外码:关系模式R中的属性X并非R的码,但X是关系S的码,则称关系R中的属性X是关系R的外码
范式
范式是表达关系模式级别的方式,低级的范式可以通过模式分解(schema decomposition)转换为高级的范式的关系模式,这个过程叫规范化
2NF(第二范式)
若R∈1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R∈2NF
以关系模式S-L-C(Sno,Sdept,Sloc,Cno,Grade)为例
Sno | Sdept | Sloc | Cno | Grade |
---|---|---|---|---|
该关系模式不是第二范式,存在如下问题:
- 插入异常
- 删除异常
- 更新复杂
- 数据冗余
第二范式也有以上问题:
Sno | Sdept | Sloc |
---|---|---|
Sno->Sdept
Sdept->Sloc
3NF(第三范式)
第三范式旨在消除非主属性对码的传递依赖。其定义如下:设关系模式R<U,F>属于第一范式,不存在主码X,属性组Y,非主属性Z,使得X->Y,Y->Z,Z不包含于Y,Y->X不成立,则称关系模式R满足第三范式
BCNF
关 系 模 式 R < U , F > ∈ 1 N F , 若 X → Y 且 Y 不 包 含 于 X 时 , X 必 含 有 码 , 则 R < U , F > ∈ B C N F 关系模式R<U,F>∈1NF,若X\rightarrow Y且Y不包含于X时,X必含有码,则R<U,F>∈BCNF 关系模式R<U,F>∈1NF,若X→Y且Y不包含于X时,X必含有码,则R<U,F>∈BCNF
BC范式满足以下特点:
- BC范式一定是第三范式,其消除了非主属性对码的传递和非主属性对码的部分函数依赖
- 所有非主属性对每一个码都是完全函数依赖
- 所有主属性对于不包含它的码也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任何一组属性
只有一个码如C(CNO,CNAME,PCNAME),一定是BCNF
全码也一定是BCNF
如果一个模式的关系模式属于BCNF,那么它在函数依赖范畴内已经实现了彻底的分离,消除了插入和删除的异常。3NF的不彻底性表现在可能存在主属性对码的部分函数依赖和传递依赖
多值依赖
Course | Teacher | Reference |
---|---|---|
Math | LEE | Liner szu |
Math | LEE | Liner pku |
Math | LEE | Liner zju |
如上表所示,这样的一个关系模式数据冗余十分明显,增删改也很麻烦,其具有多值依赖的数据依赖。
多值依赖的定义如下:
设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中值依赖X ->->Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于X值而与Z值无关
Example:在关系模式Teaching中,(Course,Reference)组成了(x,z),有一组Teacher值,该组值仅仅与Course相关而与Reference无关,则称Teacher多值依赖于Course
若 X → → Y , 而 Z = U − X − Y = 空 集 , 则 称 X → → Y 为 平 凡 的 多 值 依 赖 若X\rightarrow\rightarrow Y,而Z=U-X-Y=空集,则称X\rightarrow\rightarrow Y为平凡的多值依赖 若X→→Y,而Z=U−X−Y=空集,则称X→→Y为平凡的多值依赖
多值依赖的性质
- 多值依赖具有对称性。即若X->->Y,则X->->Z,其中Z=U-X-Y
- 多值依赖具有传递性。若X->->Y,Y->->Z,则有X->->Z-Y
- 函数依赖是多值依赖的特殊情况。
- X->->Y,X->->Z,则有X->->YZ成立
- X->->Y,X->->Z,则有X->->Y∩Z成立
- X->->Y,X->->Z,则有X->->Z-Y,X->->Y-Z成立
多值依赖和函数依赖的区别:
数据依赖的公理系统
Armstrong公理系统
Armstrong公理系统提出的价值在于从一组函数依赖中找寻蕴含的函数依赖。
同理系统的推理规则如下:
- 自反律 即若Y包含于X,则函数依赖蕴含X->Y
- 增广律 若函数依赖蕴含X->Y,则函数依赖F蕴涵XZ->YZ
- 传递律 若X->Y,Y->Z为F所蕴含,则X->Z也为F所蕴含
根据这三条推理规则,我们可得到下列三条推理规则
- 合并规则:X->Y,X->Z,则X->YZ
- 伪传递规则:由X->Y,WY->Z,则有XW->Z
- 分解规则: 由X->Y,及Z包含于Y,有X->Z
在关系模式R<U,F>中为F所蕴含的所有函数依赖的集合称为F的闭包
Armstrong公理系统具有有效性和完备性。有效性是指由F出发的根据Armstrong公理系统推导出来的函数依赖均属于F的闭包中。完备性是指F的闭包中的函数依赖均可由F根据Armstrong公理系统推导得出。
属性集X关于函数依赖集F的闭包,X,Y包含于U,X+={A|X->A能够由F根据Armstrong公理系统推出}
X->Y能由Armstrong公理系统推导而出的充要条件是Y属于X+
判断X->Y能否由Armstrong公理系统推导而出就可以转换为求X+,然后判断Y是否属于X+
求X+的算法可见书本191页
函数依赖集和最小依赖集
如果G+=F+ ,则称G和F等价,F是G的覆盖,G是F的覆盖
每一个函数依赖集F均等价于一个极小函数依赖集Fmin
最小依赖集(minimal cover)满足下列条件:
-
F中任一函数依赖的右边仅有一个属性
-
F中不存在这样的函数依赖
X → Y 使 得 F − X → Y 与 F 等 价 X\rightarrow Y使得F-{X\rightarrow Y}与F等价 X→Y使得F−X→Y与F等价 -
F中不存在这样的函数依赖 X->A,使得X有真子集Z,使得F-{X->A}∪Z->A与F等价
求F的最小依赖集的算法可以见书本193页底部
模式分解
关 系 模 式 R < U , F > 的 一 个 分 解 是 指 p = R 1 < U 1 , F 1 > , R 2 < U 2 , F 2 > , R 3 < U 3 , F 3 > . . . , 其 中 F i 为 函 数 依 赖 F 在 U i 上 的 投 影 , U i 的 并 集 等 于 U 关系模式R<U,F>的一个分解是指p={R1<U1,F1>,R2<U2,F2>,R3<U3,F3>...}, 其中Fi为函数依赖F在Ui上的投影,Ui的并集等于U 关系模式R<U,F>的一个分解是指p=R1<U1,F1>,R2<U2,F2>,R3<U3,F3>...,其中Fi为函数依赖F在Ui上的投影,Ui的并集等于U
在进行模式分解时,要求分解后产生的模式与原模式“等价”。
“等价”有如下三种定义:
- 分解具有无损连接性
- 分解要保持函数依赖
- 分解既要保持函数依赖,又要有无损连接性
无损连接性:对关系模式R的分解是可回复的
函数依赖:分解后的关系模式Ri应保持原来的函数依赖
无损连接性
无损连接的定义:目前还没搞懂
判别一个分解是否为无损连接的算法:
1.如果是一个关系模式分解为两个关系模式,那么直接对两个关系模式求交集,求两个关系模式的对称差,如果存在对称差对交集的函数依赖,那么该分解就是无损的
2.如果分解为多个关系模式,则需要:
- 建立一张n行k列的表,第i行表示关系模式Ri,第k列关系模式R中的第k个属性。若属性Aj 存在于Ri 中,则填上aj,否则填上aij
- 逐步取关系模式R中的函数依赖F,找到X->Y中属性X所在的列中名字相同的行,查看这些行中Y的值,如果Y的值存在ak ,则将名字相同的所有行的Y属性的列的值更改为ak ,如果不存在,则找到这些行中最小的bij ,统一改为bij
- 重复第二步,直到某一行的元素全部为a,则说明该分解是无损的。如果行的元素不再发生变换,且没有一行全部为a,则停止分解。
函数依赖型
to be countinued…