9本章主要讨论关系数据库规范化理论,讨论如何判断一个关系模型是否是好的关系模式,以及如何将不好的关系模式分解成好的关系模式,并保证所得到的关系模式仍能表达原来的语义。
一、9.1关系模型设计的问题
首先,我们通过例子来说明。
假设有描述学生选课及住宿情况的关系模式:
S-L-C(Sno,Sname,Ssex,Sdept,Sloc,Cno,Grade)
其中各属性分别为:学号、姓名、性别、学生所在系、学生所住宿舍楼、课程号和考试成绩。受每个系的学生都住在同一宿舍楼中,该关系模式的主键为(Snow,Cno)。
在此情况下会产生如下问题:
9.1.1数据冗余问题
在这个关系中,学生所在系和其所在宿舍楼的信息有冗余,因为一个系有多少个学生这个系所对应的宿舍楼的信息就至少要重复储存多少遍,学生基本信息(包括学生学号、性别、姓名和所在系)也有重复,一个学生修了多少门课,他的基本信息就重复多少遍。
9.1.2数据更性问题
如果某一学生从计算机系转到了信息管理系,那么不但要修改此学生的,Sdept列的值,而且还要修改器Sloc列的值,从而使修改复杂化。
9.1.3数据插入问题
虽然新成立了某个系,并且确定了该系学生的宿舍楼,既已经有了Sdept和Sloc信息,却不能将这个信息插入到表中,因为这个系还没有招生,其Sdept和Sloc列的值均为空,而Sdept和Sloc是这个表的主键,不能为空。
9.1.4数据删除问题
当一名学生最初只选择了一门课之后,又放弃了,那么当删除该学生选修此门课的时候,因为只选了一门,所以删除选课记录的同时,也删除了学生的其他基本信息。
数据的增,删、改问题统称为操作异常。之所以出现这些属性之间不良的函数依赖关系,是因为关系模式没有设计好,而如何改造关系模式使其避免出现以上的问题,是我们讨论函数依赖的原因。
二、9.2函数依赖
首下面主要介绍关系模式中各属性之间的依赖关系
9.2.1基本概念
一般把,x函数决定为或y,函数依赖于x表示为xy.
定义及如果有一个关系模式R(A1,A2,...An) X和Y为 {A1,A2,...An}的子集,r是R的任一具体关系,那么对于关系r中的任意一个X都只有一个Y值与之对应,统称X函数决定Y或Y函数依赖于X。
例如,对学生关系模式student(Sno,Sname,Sdept,Sage),有以下函数依赖关系:
Sno->Sname,Sno->Sdept,Sno->Sage
例如,对学生选课关系模式SCt(Sno,Cno,Grade),有以下函数依赖关系:
(Sno,Cno)->Grade
定义9.1
设有关系模式R(A1,A2,...An) X和Y为 {A1,A2,...An}的子集,r是R的任一具体关系,t1,t2是r中任意两个元组。如果由t1[X]=t2[X]可以推导出t1[Y]=t2[Y],则称X函数决定Y,或Y函数依赖于X,记为X->Y.
只要 t1[X]=t2[X]和t1[Y]=t2[Y]成立,就有X->Y.
9.2.2一些术语和符号
设有关系模式R(A1,A2,...An) X和Y为 {A1,A2,...An}的子集,有以下结论:
(1)如果x->y但Y不包含于x,则x->y,是非平凡的函数依赖
如果xy但外包含于x,则xy,是平凡的函数依赖。
(不做特别声名讨论都是非平凡的函数依赖)。
(2)如果Y不依赖于x,则记作x->y
(3)如果x->y则称x为决定因子
(4)如果x->y并且y->x则记作x <->y
(5)如果x->y,并且对于x的一个任意真子集,x`都有x`-/>y`则称y完全函数依赖于X, 记作x-f->y; 如果x`->y`成立,则称Y部分函数依赖于x 记作x-p->y
(6)如果x->y(非平凡函数依赖,并且x-/>y,y->z则称z传递函数依赖于x
(7)设k为关系模式r的一个属性或属性组,若满足
K-f->A1,K-f->A2,...K-f->An
则称k为关系模式r的候选键(或候选码),称包含在候选键中的属性为主属性,不包含在任何候选键中的属性称为非主属性。
9.2.3函数依赖的推理准则
1.Armstrong公理
1自反律:若Y⊆X⊆U,则X→Y为F所蕴含;
2增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含;
3传递律:若X→Y,Y→Z为F所蕴含,则X→Z为F所蕴含。
根据上面三条推理规则,又可推出下面三条推理规则:
2.Armstrong公理的推论
- 合并规则:若X→Y,X→Z同时在R上成立,则X→YZ在R上也成立。
- 分解规则:若X→W在R上成立,且属性集Z包含于W,则X→Z在R上也成立。
- 伪传递规则:若X→Y在R上成立,且WY→Z,则XW→Z。
- 复合规则:若X→Y和W→Z在R上成立,且XW→YZ在R上也成立。
9.2.4闭包及候选键求解的方法
1.函数依赖集的闭包
定义9.2对于一个关系模式R(U,F)U是R的属性全集,F是R上的一组函数依赖,设X,Y是U的子集,对于关系模式的任一关系r,如果满足F,则r满足X->Y,那么称F逻辑蕴含X->Y,或函数依赖X->Y由F导出。
所有被F逻辑蕴涵的函数依赖的全集称为F的闭包记作F+ 。
例9.4 已知关系模式R (A,B,C,D,E,G) 及其函数依赖集F:
F=|AB->C,C->A,BC->D,ACD->B,D->EG, BE—>C,CG->BD, CE-AG|
判断BD->AC 是否属于F+。
解:由D->EG,可推出:D->E,BD->BE................1
又由BE->C,C一>A,可推出:BE->A,BE->AC..............2
由①、②,可推出 BD->AC,因此BD->AC被F所蕴涵,即BD->AC属于F+。
对关系模式R(U,F)应用Armstron公理系统计算F+的过程
步骤1:初始F+=F
步骤2:对F+中的每个函数依赖f,在f上应用自反性和增广性,将结果加人F+中;对F+中的一对函数依赖f1和f2,如果f1和f2可以使用传递律结合起来,则将结果加人F+中。
步骤3:重复步骤2,直到F不再增大为止。
2.属性集闭包
判定两数依赖X一>丫是否能由F+导出的问题,可转化为求对X+并判定Y是否是X+子集的问题。即求函数依赖集闭包问题可转化为求属性集问题。
定义9.3 对关系模式R(U,F),求属性集 X相对于函数依赖集 F的闭包 X+的算法如下:
步骤1:初始X+=X
步骤2:如果F中有某个函数依赖Y->Z满足Y⊆X+。则X+=X+UZ
步骤了:重复步骤2,直到对X+不再增大.
3.候选键的求解方法
- 求L,N类
- 若(L,N)+=U;5.候选键
- 若(L,N)+不等于全集U则求(L,N,LR)+
- (L,N)+=U或者(L,N,LR)+=U
对于给定的关系模式尺(A1,A2,…,An)和函数依赖集 F,现将卫的属性分为如下四类:
1.L类:仅出现在函数依赖左部的属性。
2.R类:仅出现在函数依赖右部的属性
3.N类:在函数依赖的左部和右部均不出现的属性。
4.LR 类:在函数依赖的左部和右部均出现的属性。
对R中的属性X,可有以下结论:
(1)若X是L类属性,则X一定包含在关系模式R的任何一个候选键中;若X+包含了R的全部属性,则X为关系模式R的唯一候选键。
(2)若X是R类属性,则X不包含在关系模式R的任何一个候选键中。
(3)若X是N类属性,则X一定包含在关系模式R的任何一个候选键中。
(4)若X是LR类属性,则X可能包含在关系模式R的某个候选键中。