目录
一、关系模式规范化理论
1、关系模式规范化概念
- 关系规范化理论是解决关系数据库中数据冗余大、插入、删除等异常问题
解决的问题:
① 数据冗余大
② 插入异常 —— 该插入的数据未被插入
③ 删除异常 —— 不该删除的数据被删除
④ 更新异常
- 关系数据库的规范化理论主要解决的问题是:如何构造合理的数据逻辑结构
2、关系模式应满足的基本要求
- 元组的每个分量必是不可分割的数据项
- 数据冗余尽可能少
- 不产生插入异常现象
- 不产生删除异常现象
- 不会因数据更新而引起数据不一致问题
- 数据组织要合理
3、关系规范化的意义
(1)一个好的数据库应遵循的标准
- 每个表都应提供一个唯一标识,用于区别不同的行
- 每个表应存储单个实体类型的数据
- 每个表不应该出现值全部相同的行、列
- 尽量避免出现null值的列
- 尽量避免值重复储存
(2)规范化的意义
- 把关系中的每一个数据项都转换成一个最小的数据项,即不可再分的数据项
- 消除冗余,并使关系检索得到简化
- 消除数据在进行插入、删除和修改时的异常情况
- 关系模型灵活,易于使用非过程化的高级查询语言进行查询
二、函数依赖
1、函数依赖的概念
设R(U)是一个属性集U上的关系模式,X和Y是U的子集
若对于R(U)的任意一个可能的关系r
r中任意两个元组u、v
只要有u[X]=v[X],就有u[Y]=v[Y]
则称 X函数确定Y 或 Y函数依赖于X,记作X→Y
X称为决定属性集,Y称为依赖因素
注:函数依赖指R中所有关系均要满足的约束条件
【例1】学生(学号,姓名,性别,年龄,系名) 假设不重名
学号→姓名 学号→性别 学号→年龄 学号→系名
对于学号→姓名,若某俩元组学号相同,则俩元组对应的姓名必然相同
(1)平凡、非平凡函数依赖
- X→Y,但 ,则称X→Y是非平凡的函数依赖
- X→Y,但 ,则称X→Y是平凡的函数依赖
- 若X→Y、Y→X,则X与Y相互依赖,记为
- 若Y不函数依赖于X,则记为
(2)如何判断函数依赖?
- 如果两属性集X、Y间是1:1联系,则存在函数依赖
- 例如:课程关系中如果课程号和课程名都是唯一的,则有课程号课程名
- QQ用户关系模式中,如果不允许同名用户存在,则有QQ号QQ用户名
- 如果两属性集X、Y之间是N:1联系,则存在函数依赖X→Y
- 例如:读者关系模式中,读者卡号→单位,即不同的读者来自于相同的单位
- 如果两属性集X、Y间是M:N联系,则不存在函数依赖
- 例如:读者姓名和办卡日期,多个读者办卡日期是相同的,而同一个办卡日期对应多个不同的读者,因此读者姓名和办卡日期之间是M:N联系,不存在函数依赖
2、函数依赖的分类
(1)完全函数依赖
设R(U)是属性集U上的关系,X′是X的真子集,如果X→Y,并且对于X的任何一个真子集X′,都不存在X'→Y,则称Y对X完全函数依赖,记为
- 例如:X(读者卡号,图书编号)借书日期
- X' 读者卡号借书日期:一个读者对应不同借书日期,一个借书日期有多个读者借阅
- X' 图书编号借书日期:一个图书编号对应不同借书日期,一个借书日期会借出多种书
决定因素只含单个属性的函数依赖必为完全函数依赖
(2)部分函数依赖
设R(U)是属性集U上的关系,X′是X的真子集,如果X→Y,并且对于X的任何一个真子集X',都存在X→Y,则称Y对X部分函数依赖,也就是Y不完全函数依赖于X,记为
- 例如:X(供应商编号,商品号)供应商名
- X' 供应商编号→供应商名:1:1关系
- X' 商品号→供应商名:不同的商品号对应一个供应商
决定因素包含两个及以上属性的函数依赖才可能存在部分函数依赖
(3)传递函数依赖
在R(U)中,X、Y、Z是U的子集,如果X→Y、(YX)、Y→Z、Y→X不成立,则称Z对X传递函数依赖,记为
需要注意的是:
如果Y→X成立,而X→Y,则Z直接依赖于X
如果Y⊆X,则Z直接依赖于X
- 例如:商品号→产地,产地→主负责人,商品号主负责人
- 学号→学院名称,学院名称→院长,学号院长
3、码
设k为R(U,F)中的属性和属性组合,k'是k的真子集,若k→U,且不存在 k'→U成立,则k为R的候选码,简称为码
(1)主码、主属性、非主属性
- 若候选码多于一个,则选定其中的一个为主码
- 主属性:包含在任何一个候选码中的属性
- 非主属性:不包含在任何候选码中的属性
(2)码的性质
- 决定性(标识的唯一性):对于R中的每一个元组,k值确定后,该元组就确定了
- 最小性(无冗余性):当k是属性集合时,k的任何一部分都不能标识该元组
三、关系范式
1、范式的分类
(1)第一范式 1NF
1NF:在一个关系模式R中,如果R的每一个属性都是不可再分的数据项,则称R属于第一范式(1NF),记为R∈1NF
例如,下面职工和部门关系模式由于存在属性再分的情况,因此不是第一范式
- 职工(职工编号,姓名,工资(基本工资,补贴,奖金))
- 部门(部门编号,部门名称,负责人(正负责人,副负责人))
转化的方法比较简单,只需要去掉组合项就行
例如上述两个非规范的关系模式可以转化为如下的1NF的关系模式
- 职工(职工编号,姓名,基本工资,补贴,奖金)
- 部门(部门编号,部门名称,正负责人,副负责人)
(2)第二范式 2NF
2NF:如果一个关系R属于1NF,且它的每一个非主属性都完全依赖于码,则称R属于第二范式(2NF),记为R∈2NF
- 读者姓名、性别、单位等非主属性只依赖于读者卡号,而与图书编号没有关系
- 书名、作者、出版社名称、地址只依赖于“码”的一部分图书编号,不依赖于读者卡号
- 存在着诸如(读者卡号,图书编号)姓名,(读者卡号,图书编号)出版社名称 的部分函数依赖,因此不满足2NF条件
根据2NF的定义,将“图书管理”关系模式分解成满足2NF的关系模式集合如下:
- 读者(读者卡号,姓名,性别,单位,办卡日期)
- 图书(图书编号,书名,类别,作者,单价,出版社,地址)
- 借阅(读者卡号,图书编号,借书日期,还书日期)
推论:如果关系模式R满足1NF,且它的每一个候选码都是单属性,则R属于2NF
(3)第三范式 3NF
3NF:如果一个关系模式R满足2NF,并且每个非主属性都不传递函数依赖于码,则R属于第三范式,记为R∈3NF
- 在图书(图书编号,书名,类别,作者,单价,出版社,地址)中
- 图书编号→出版社,出版社→地址,存在图书编号地址
- 存在传递依赖,不满足3NF要求
对图书关系按3NF的要求进行分解,则分解后的关系模式为:
- 图书(图书编号,书名,类别,作者,单价,出版社)
- 出版社(出版社名称,地址)
- 推论1:如果一个关系模式R满足1NF,并且它的每一个非主属性既不部分依赖于码,也不传递依赖于任何候选码,则R属于3NF
- 推论2:如果一个关系模式R不存在非主属性,则R一定为3NF
(4)BCNF
BCNF:R属于1NF,且每个属性(主属性和非主属性)都不部分依赖和传递依赖于码,则R属于BCNF
- R(学号,课程号,课程名,成绩)
- 码有(学号,课程号),(学号,课程名)
- 主属性 (学号,课程号)课程名,(学号,课程名)课程号
- 不存在非主属性成绩对码的部分依赖和传递依赖
- 因此R满足3NF,而不满足BCNF
根据BCNF定义,将R分解成BCNF关系模式如下:
- 课程(课程号,课程名)
- 选课(学号,课程号,成绩)
- 对比3NF,BCNF既要检查主属性,还要检查非主属性
- 若满足BCNF,必然满足3NF
- 所有非主属性对每一个码都完全函数依赖
- 所有主属性对每个不包含它的码都完全依赖
- 没有任何属性完全函数依赖于非码的任何一组属性
【例1】假设高校图书管理数据库有关系模式:职工管理图书(仓库号,图书类别编号,职工号)。其中包含的语义为:一个仓库可以有多个职工;一名职工仅管理一个仓库;每个仓库的每类图书仅由一名职工负责(但每名职工可以负责不同类别的图书),判断此关系模式属于第几范式。
根据语义可以得到此关系模式的函数依赖:
- 职工号→仓库号
- (仓库号,图书类别编号)→职工号
由码定义中应满足的两个条件可以确定该关系模式的码是(仓库号,图书类别编号)
- 非主属性:职工号
- 主属性:仓库号,图书类别编号
根据3NF的定义:不存在非主属性对码的部分依赖和传递函数依赖,所以此关系模式属于3NF,又因为存在主属性仓库号对非主属性职工号的完全依赖,即职工号→仓库号,据BCNF 的定义,此关系模式不属于BCNF。
(5)多值依赖及4NF
① 多值依赖的定义
设关系模式R(U),U是属性集,X、Y、Z是U的子集。如果R的任一关系r,在(X,Z)上的每一个值,都有一组Y值与之对应,且Y值仅取决于X值,而不取决于Z值,则称Y多值依赖于X,记为X→→Y
- 若X→→Y,而Z=,则X→→Y称为平凡的多值依赖
- 若X→→Y,而Z≠,则X→→Y称为非平凡的多值依赖
课程C 教师T 参考书B 数据库 王武 数据库应用及原理 计算机网络 黎明 计算机网络应用 计算机组成 陈莉 计算机组成原理 课程C和教师T唯一确定一组B,B却与T无关,经由C决定,然而T并不是空集,所以是非平凡的多值依赖,C→→B
如何判断多值依赖?
X值相同,将Z值交换生成新的元组仍在关系中,则称X→→Y
X Y Z x y1 z1 ↓ x y2 z2 ↑ x y1 z2 x y2 z1 ② 多值依赖的性质
- 多值依赖有对称性:若X→→Y,则有X→→Z,其中Z=U-X-Y
- 多值依赖有传递性:若X→→Y,Y→→Z,则有X→→Z-Y
- 函数依赖是多值依赖的特殊情况:若X→Y,则X→→Y
- 若X→→Y,X→→Z,则
- X→→
- X→→
- X→→Y-Z
- X→→Z-Y
③ 多值依赖与函数依赖的区别
有效性、包含性
④ 4NF
消除表中的多值依赖
【例2】设有一个记录各个球队队员每场比赛进球数的关系模式R( 队员编号,比赛场次,进球数,球队名,队长名),如果规定每个队员只能属于一个球队,每个球队只有一个队长。
(1)试写出关系模式R的基本函数依赖和关键码。
(2)说明R不是2NF模式的理由,并把R分解成2NF模式集。
(3)进而把R分解成3NF模式集,并说明理由。(1)每个队员只能属于一个球队:队员编号→球队名
每个球队只有一个队长:球队名→队长名
每个队员每场比赛只有一个进球数,这条规则也是成立的:(队员编号,比赛场次)→进球数
从上述三个函数依赖可知道,R的码为(队员编号,比赛场次)(2)解:(队员编号,比赛场次)→(球队名,队长名)
队员编号→球队名球队名→队长名
显然,其中第一个函数依赖是一个局部依赖,因此R不是2NF模式
对R应该进行分解:
- R1(队员编号,球队名,队长名)
- R2(队员编号,比赛场次,进球数)
(3)解:R2(队员编号,比赛场次,进球数)中:(队员编号,比赛场次)→进球数,码为(队员编号,比赛场次),可见R2已是3NF模式
R1(队员编号,球队名,队长名)中:队员编号→球队名,球队名→队长名
可见存在传递依赖,因此R1不是3NF模式
对R1应分解成两个模式:
- R11(队员编号,球队名)
- R12(球队名,队长名)
- R2(队员编号,比赛场次,进球数)
四、函数依赖的公理系统
1、求候选码的方法
- 属性分类:对关系中属性进行分类(四大类)
- 闭包运算:对确定的属性求闭包,若不能构成候选码,再将确定的属性(L类、N类)和待定的属性(LR类)进行组合,做闭包运算,直到得到的属性组能够推出全部属性
(1)属性分类
- L类属性:只出现在左边的属性
- R类属性:只出现在右边的属性
- LR类属性:在左右均出现的属性
- N类属性:没有在F中出现的属性
- 一定属于候选码的属性:只出现在左边,或左右都没有出现过,L类或N类
- 可能属于候选码的属性:左右都出现过,LR类
- 不属于候选码的属性:只在右边出现过,R类
(2)闭包运算
若则X为候选码
【例1】集合U={A,B,C,D,E,G},函数依赖集F={AB→C,CD→E,E→A,A→G},求U的所有候选码
U中L属性:B、D,LR属性:A、C、E
,所以ABD是候选码
,所以CBD是候选码
,所以EBD是候选码
所以R的所有候选码为ABD、CBD、EBD
【例2】设R(A,B,C,D,E,F),G={AB→E,AC→F,AD→B,B→C,C→D},求R的所有候选码
R中L属性:A,LR属性:B、C、D
,所以AB是候选码
,所以AC是候选码
,所以AD是候选码
所以R的所有候选码为AB、AC、AD
2、求最小函数依赖集的方法
(1)函数依赖集等价
- 拆分右侧:将A→BC拆为A→B,A→C
- 去除自身求闭包:若有AB→C,BC→E,AE→G,如果去除AB→C这个关系,通过剩余的关系求出也能推出C,则可以删去AB→C
- 左侧最小化:例如ABC→D,观察ABC中,A是否能由BC推出,B是否能由AC推出,C是否能由AB推出。假设C能被AB推出,左侧删去C,变成AB→D
【例1】设F={C→A,CG→BD,CE→A,ACD→B} ,求最小函数依赖集
- 将CG→BD拆分为CG→B和CG→D
- 去除C→A:,无法推出A,保留C→A
- 去除CG→B:,可以推出B,删去CG→B
- 去除CG→B:,无法推出D,保留CG→D
- 去除CE→A:,可以推出A,去除CE→A
- 去除ACD→B:,无法推出B,保留ACD→B
- 现在剩下:{C→A,CG→D,ACD→B}
- C→A已经最小
- CG→D,C不能推G,G不能推C,因此也是最小
- ACD→B,C可以推出A,去掉A
本题的最小函数依赖集为{C→A,CG→D,CD→B}
五、关系模式的分解
六、课后习题