1 问题提出
1. 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>的一个关系。
1.2 数据依赖:
数据依赖是一个关系内部属性与属性之间的一种约束关系。这种约束关系是通过属性间值的相等与否体现出来的数据间的相关关系。
人们已经提出了多种类型的数据依赖,最为常见的是函数依赖和多值依赖。
1.3 函数依赖:
函数依赖极为普遍的存在现实生活中。比如描述一个学生的关系,可以有学号(Sno),姓名(Sname),系名(Sdept)等几个属性。由于一个学号对应一个学生,一个学生只在一个系学习。因而当"学号"值确定后,学生姓名及所在系就被唯一(一个x对应一个y)确定
一个好的关系模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽可能减小。
数据冗余:比如,每个系的系主任姓名重复出现。
更新异常:由于数据冗余,当更新数据时,系统要花费大量代价。
插入异常:如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库
删除异常:如果某个系的学生全部毕业,则在删除该系学生信息的同时,这个系及其系主任的信息也丢掉了。
发生以上问题的原因是模式中的函数依赖存在某些不好的性质。
2 规范化
2.1 函数依赖
设R(U)是属性集U上的关系模式,X,Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不存在两个元组在X上属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X,记作X->Y.
注意:函数依赖不是指关系模式R的某个或某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件。
X->Y,但Y不包含于X,则称X->Y 是非平凡的函数依赖
X->Y,但Y包含于X,则称X->Y 是平凡的函数依赖
X->Y,则X称为这个函数依赖的决定属性组,称为决定因素。
X->Y,Y->X,则X<->Y
若Y不函数依赖于X,则称X不能推出Y
在R(U)中,如果X->Y,并且对于X的任何一个真子集X`,都有X`不能推出Y,则称Y对X完全函数依赖。
若X->Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖
在R(U)中,如果X->Y(Y不包含于X),Y不能推出X,Y->Z,Z不包含于Y,则称Z对X传递函数依赖。
2.2 范式
关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。满足最低要求的叫第一范式。简称1NF。
对于各种范式之间的关系有
5NF包含于4NF包含于....1NF
一个低一级范式的关系模式通过模式分解可以转换为高一级范式的关系模式的集合,这种过程叫做规范化。
第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)
第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键;完全依赖是针对于联合主键的情况,非主键列不能只依赖于主键的一部分)
第三范式(3NF):满足第二范式;且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。(A -> B, B ->C, A -> C)