一:问题的提出
一个学校教务数据库。U={Sno学号, Sdept所在系, Mname系主任姓名, Cno课程号, Grade成绩};
1: 数据冗余大:如系主任名字重复出现,浪费空间。
2: 更新异常:由于数据冗余,当更新数据库时,系统需要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险。
如更换系主任后,必须修改与该学生的每一个元组。
3: 插入异常:如果某个系新成立,尚无学生,则数据库无法记录该系及其系主任的信息。
4: 删除异常:如果系学生全部毕业,在删除信息时,会删除系及系主任的信息。
S(Sno,Sdept,Sno->Sdept);
SC(Sno,Cno,Grade,(Sno,Cno)->Grade);
DEPT(Sdept,Mname,Sdept->Mname);
二:术语
1: 函数依赖:设R(U)是属性集U上的关系模式,X,Y是U的子集。
若对于任意R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性相等,而在Y上的属性不相等,则称X函数决定Y或Y函数依赖于X,记作X->Y;
如Sname=f(Sno),即Sno决定Sname,这时称Sname函数依赖Sno,记为Sno->Sname;
2: 非平凡函数依赖:X决定Y,但X不包含Y。
3: 平凡函数依赖:X决定Y,X包含Y。对于任意关系模式,平凡依赖都是必然成立的。
例如:(职工号,性别)->职工号,这时称为平凡函数依赖。
4: 完全依赖:在R(U)中,X决定Y,但对于X的任一真子集X',都有X'不决定Y,则称Y对X完全函数依赖。否则称为部分函数依赖。
5: 候选码:设K为R<U,F>中的属性或属性集合,若U完全依赖K,则称K为候选码。
6: 主码:当候选码多于一个时,选择其中一个作为主码。
7: 主属性:包含在任何一个候选码中的属性。
8: 非主属性:不包含在任何码中的属性。
9: 全码:整个属性都是码。
10: 外码:关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X为R的外码。
11: 多值依赖:
在关系模式中,函数依赖不能表示属性值之间的一对多的联系。这些属性之间虽然没有直接联系,但存在间接联系。
把没有直接联系,但有间接联系的联系称为多值依赖。
举例如下,有这样一个关系 <仓库管理员,仓库号,库存产品号> ,
假设一个一个产品只能放到一个仓库中,但是一个仓库可以由若干管理员,那么对应于一个 <仓库管理员,库存产品〉有一个仓库号,
而实际上,这个仓库号只与库存产品号有关,与管理员无关,就说这是多值依赖。
A: 多值依赖的对称性:X->->Y,则X->->Z。其中Z=U-X-Y。
三:第一范式(1NF)
每一个分量必须是不可分割的数据项。
1: 特点:有主关键字,主键不能为空,主键不能重复,字段不可再分。
如联系方式字段:不可同时包含EMAIL和电话。
四:第二范式(2NF):(即消除非主属性部分函数依赖)
若R属于1NF,且每一个非主属性完全依赖于码,则R属于2NF。
1: 如关系模式SLC(Sno, Sdept, Sloc, Cno, Grade)。SLOC为学成住处,且每个系的学生住处在同一个地方。码为(Sno, Cno)。
Grade完全依赖(Sno, Cno)。
Sdept完全依赖Sno。但是Sdept部分依赖(Sno, Cno)。
Sloc完全依赖Sno。但是Sloc部分依赖(Sno, Cno)。
即Grade对码完全函数依赖,而Sdept和Sloc对码是部分函数依赖。
SC(Sno, Cno, Grade)
SL(Sno, Sdept, Sloc)
2: 如果一个关系模式不属于2NF,会产生以下问题:
A: 插入异常:如当某生未选课,即Cno为空,则该学生信息无法插入。
B: 删除异常:当某生只选一门课,后又不想选了。
C: 修改负责:如果换系。
五:第三范式:在第二范式的基础上消除传递依赖。(消除非主属性部分依赖和传递依赖)
1: 如SL(Sno, Sdept, Sloc)码为Sno。
其中Sno->Sdept, Sno->Sloc, Sdept->Sloc。从而存在传递依赖。
SD(Sno, Sdept)
DL(Sdept, Sloc)
六:扩充的第三范式(BCNF)(在3NF的基础上消除主属性对码的部分和传递函数依赖,每一个决定因素都包含码)
1: 所有非主属性对每一个码都是完全函数依赖。
2: 所有主属性对每一个不包含他的码,也是完全函数依赖。
3: 没有任何属性完全函数依赖于非码的任一组属性。
4: 如STJ(S学生,T教师,J课程)。每个教师只教一门课,每门课都若干教师。
(S,J)->T;(S,T)->J; 同时T->J;
这里,由于T->J,从而主属性J部分依赖于码(S,T)。
STJ是3NF,因为没有任何非主属性对码传递依赖或部分依赖。但STJ不是BCNF关系,因为T是决定因素而T不包含码。
可以分解成ST和TJ。
七:4NF(第四范式:消除多值依赖)
1: WSC(W仓库,S保管员,C商品):其中仓库有若干个保管员。每个保管员保管所在仓库所有商品。
按照语义,每个W,S都有一个完整的集合与之对性而不问C的取值,这是W多重依赖S,即W->->S。
由于每个保管员保管所在仓库所有商品,所以W->->C;
由于这个关系是全码,这是问题出现了,对于每个仓库,有M(该仓库管理人员数据)*N(仓库产品数目)个数据。
这是可以分解成WS和WC即S->W及C->W;
2: 总结:1->M->N;这是可以分解成1->M和1->N。
八:5NF(第五范式)
九:总结
1: 1NF->2NF:消除非主属性对码的部分函数依赖
1: 2NF->3NF:消除非主属性对码的传递函数依赖
1: 3NF->BCNF:消除主属性对码的部分和传递函数依赖
1: BCNF->4NF:消除多值依赖