关系数据库理论
数据依赖:数据依赖是一个关系内部,属性和属性之间的一种约束关系
常见的数据依赖有函数依赖[1](FD),多值依赖[2](MVD)
对于数据库来说,如果你的关系模型设计的不好,将会存在以下问题:
- 数据冗余太大:一个信息被多次存储
- 数据更新异常:当一个数据要进行修改时,所有的副本都要进行修改
- 插入异常:只有一些必要的信息在数据库中时,你才可以装到数据库里
- 删除异常:删除A时,B也会被删除
什么是规范化理论?
规范化理论是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决数据冗余、插入异常、更新异常、删除异常这些问题。
什么是规范化?
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化
前置概念
-
超码:某一个能够唯一标识一条记录的属性或属性集
-
候选码:某一个属性组的值能够唯一的标识一个元组,而其子集不能,则称该属性组为候选码,候选码是一类特殊的超码,包含候选码的属性组一定是超码
-
主码:若一个关系中有多个候选码,则选定其中的一个为主码
-
主属性:候选码属性组中的各个属性称为主属性
-
非主属性:不包含在候选码中的属性称为非主属性
-
全码:关系模式的所有属性是这个关系的候选码,则称该属性组为全码
例子:学生表(学号、姓名、性别、年龄、班级、系)
-
学号可以唯一的标识出一个同学的身份,我们可以设置学号为主码。是最简单的候选码。
-
当姓名不重复的时候姓名也可以作为唯一标识,也可以用来作为候选码,所以姓名也可以作为候选码
-
以此类推,最极端的情况是全表都用来做主码,这时的主码也叫全码。
-
所以这里候选码可以是学号,或者姓名(前提是姓名不重复),但是学号+姓名不是候选码,由于它的子集例如学号,姓名能唯一标识一个元组,故不符合定义,它是超码,也就是说候选码中的所有属性都是必须的,缺少了任何一个属性,就不能唯一标识一个元组了,候选码是可以唯一标识一个元组的最少的属性集合。而超码是没有最少属性这个要求的。
-
由主码的定义可知,主码可以从这两者(学号,或者姓名(前提是姓名不重复))者之间选择一个即可
-
主属性为候选码属性组之间的各个属性,例如,候选码:学号,主属性为学号,非主属性为姓名,性别,年龄,班级,系
-
注意:主属性不能唯一的标识一个元组,而主码必定能够标识(因为主码必定是候选码),两者是不同的.
-
第一范式
设 R 为任一给定关系,如果 R 中每个列与行的交点行的取值都是不可再分的基本元素,则 R∈1NF。
意思就是所有属性不可再分,不允许出现表中有表的情况。所有关系模式中的二维表都满足 1NF。
不满足第一范式的数据库模式不能称为关系数据库
栗子:学生信息( 学生ID,学生姓名,所在年级,性别,参加课程,课程ID,课程名称,课程描述,教师ID,教师姓名,教授课程)
不满足1NF,参加课程可以再分
学生表(学生ID,学生姓名,所在年级,性别)
学生课程表(学生ID,课程ID,课程名称,教师ID,教师姓名,课程描述)
1NF 确保属性不可再分,不会出现表中有表的情况
第二范式
若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R∈2NF
消除部分依赖列,也就是说是否有依赖于一部分主键的列,有就消除
我们需要消除表中部分依赖主键的列,使得非主键字段完全依赖于主键字段。
还用上文中的例子,学生课程表中主键是学生ID和课程ID,但是教师ID,教师名称,课程描述不依赖于学生ID。
所以需要把学生课程表再次拆分
学生表(学生ID,学生姓名,所在年级,性别)
学生课程表(学生ID,课程ID,课程名称)
课程表(课程ID,教师ID,教师名称,课程描述)
这样就好很多
2NF 消除非主属性的部分函数依赖,减少了数据冗余
第三范式
若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。
意思是去掉表中不直接依赖于候选码的非主属性,或者说是消除非主属性的传递函数依赖。
在课程表中,教师ID依赖于课程ID,教师名称又依赖于教师ID,有传递依赖
学生表(学生ID,学生姓名,所在年级,性别)
学生课程表(学生ID,课程ID,课程名称)
课程表(课程ID,教师ID,课程描述)
教师表(教师ID,教师名称)
这样就可以了
3NF 清除非主属性的传递函数依赖,解决大多数插入、删除操作异常的问题,数据冗余也有效控制住了。
BC范式
关系模式R<U,F>中,每一个决定因素都包含R的一个码(候选键),则R属于BCNF。
通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
举例:假设有 R={A, B, C, D},F={AB→C, AB→D, D→A},不难发现 AB 为 R 的候选键,函数依赖关系中没有非主属性的部分依赖和传递依赖,所以 R 是属于第三范式的。但是不属于 BCNF,由于D→A 的决定因素 D 不包含在 R 的候选码中。
BCNF 确保决定因素必须包含主键,解决了所有插入、删除操作异常的问题。
第四范式
关系模式R<U,F>属于1NF,如果对于R的每个非平凡多值依赖X->->Y(Y不包含于X),X都含有码,则称R<U,F>属于4NF
多值依赖
设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X->->Y成立,当且仅当对R(U)的任意关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值,与z值无关。
例子:学校某一门课程由多个教授讲授,他们使用同一套参考书。每个教师可以讲授多门课程,每种参考是可以供多门课程使用。可以用一个非规范化的关系来表示教师T、课程C和参考书B之间的关系。
课程C | 教师T | 参考书B |
---|---|---|
物理 | 李勇 | 普通物理学 |
物理 | 李勇 | 光学原理 |
物理 | 李勇 | 物理习题集 |
物理 | 王军 | 普通物理学 |
物理 | 王军 | 光学原理 |
物理 | 王军 | 物理习题集 |
数学 | 李勇 | 数学分析 |
数学 | 李勇 | 微分方程 |
数学 | 李勇 | 高等代数 |
数学 | 张平 | 数学分析 |
数学 | 张平 | 微分方程 |
数学 | 张平 | 高等代数 |
… | … | … |
关系模式Teacher(C,T,B)的码是(C,T,B),所以Teacher属于BCNF,但是当某一课程增加一名讲课教师时,必须插入多个元组,类似的情况,如果某一门教材需要删除时,则必须删除多个元组。
-
在关系模式Teacher中,对于一个(物理,光学原理)有一组T值{李勇,王军},这组值仅仅决定于课程C上的值(物理)。对于另一个(物理,普通物理学),它对应的一组T值仍是{李勇,王军},但是参考书的值已经改变啦,因此T多值依赖于C。
-
同样在关系模式Teacher中,对于一个(数学,李勇)有一组B值{数学分析,微分方程,高等代数},这组值仅仅决定于课程C上的值(数学)。对于另一个(数学,王军),它对应的一组B值仍是{数学分析,微分方程,高等代数},但是教师T值已经改变啦,因此B多值依赖于C。
例子:关系模式WSC(W,S,C)中,W表示仓库,S表示保管员,C表示商品。假设每个仓库由若干个保管员,有若干个商品。每个保管员保管所在仓库的所有商品,每种商品被所有保管员保管。
W | S | C |
---|---|---|
W1 | S1 | C1 |
W1 | S1 | C2 |
W1 | S1 | C3 |
W1 | S2 | C1 |
W1 | S2 | C2 |
W2 | S2 | C3 |
W2 | S3 | C4 |
W2 | S4 | C5 |
W2 | S4 | C4 |
在关系模式WSC中,W->->C,W->->S,它们都是非平凡的多值依赖。然而W不是码,关系模式WSC的码是(W,S,C),所以关系模式WSC不属于4NF。
一个关系模式达到了BCNF但不是4NF ,仍然具有不好的性质,以WSC为例,WSC不属于4NF,但是WSC属于BCNF。在某一时刻时,某一仓库W1有n个保管员,存放m件物品,则关系中 分量W1的元组数目一定有mxn个。每个保管员重复存储m次,每种物品重复存储n次,数据的冗余度太大。采用投影分解法,消去非平凡且非函数依赖的多值依赖。
WS(W,S)
WC(W,C)
分解算法
对所有函数依赖,先将函数依赖集化成最小函数依赖集,只要左边相同,就把他们合并起来,形成的集合作为符合3NF的一个属性集。
例子:
A->B,AB->C,D->AC,D->E
最小函数依赖集:
第一步:先把右边有多个的拆成右边只有一个的
A->B,AB->C,D->A,D->C,D->E
第二步:去除左边的冗余项
因为A->B,AB->C冗余了,所以有B->C
结果为:A->B,B->C,D->A,D->C,D->E
第三步:去除传递函数依赖
D->A->B->C,去除D->C
最终结果为:
A->B,B->C,D->A,D->E
开始3NF的分解
第一步:
找候选码
L:D R:C,E
N: LR:A,B
对D求闭包,最终能够包含全部元素集合,因此D是该元素集合的唯一候选码
第二步:于是遵循左部相同合并原则,对其进行合并,形成属性集
R1={A,B}
R2={D,A,E}
R2={B,C}
第三步:查看上述集合有没有包含关系,如果有就吸收合并
显然上面没有
第四步:看分的属性组中有没有包含码,如果有就是无损且保持函数依赖的3NF,没有包含就不是无损且保持函数依赖的3NF,就添加一个属性组,把原来关系的码加进去
最终得到结果为:
R1={A,B}
R2={D,A,E}
R2={B,C}
这三个关系集上的函数依赖均满足3NF的要求
投影算法
假设有关系R(A,B,C,D,E)和FD集{AB->DE,C->E,D->C,E->A},假设要把这些FD投影到S(A,B,C),求出在S上成立的FD集合
第一步:将原来的FD转换成右边只有一个的情况
AB->D,AB->E,C->E,D->C,E->A
第二步:通过直接观察,或传递依赖,找到S(A,B,C)上的函数依赖
AB->D->C 即AB->C
C->E->A 即C->A
所以在S上成立的FD集合为{AB->C,C->A}
参考
1:http://t.csdn.cn/oUbjw
2:http://t.csdn.cn/ZZ54C
3:http://t.csdn.cn/94WpG
4:https://zhuanlan.zhihu.com/p/20028672
5:http://t.csdn.cn/4UFPS
6:http://t.csdn.cn/saSIW
7:http://t.csdn.cn/V43Ay
8:http://t.csdn.cn/ad2QG