1-2关系规范化过程
# 设计与应用开发篇
# 0x0.概念回顾
# 1.关系模式
# 2.关系数据库
在一个给定的应用领域中,所有关系的集合构成一个关系数据库
# 3.关系数据库的模式
# 0x1.问题的提出
# 0.总览
关系数据库逻辑设计:
- 针对具体问题,如何构造一个适合于它的数据模式
- 数据库逻辑设计的工具──关系数据库的规范化理论
# 1.关系模式的形式化定义
# 2.数据依赖
(3)数据依赖的类型:
- 函数依赖(Functional Dependency,简记为FD)
- 多值依赖(Multivalued Dependency,简记为MVD)
- 其他
(4)关系模式的简化表示
关系模式R(U, D, DOM, F)可简化为一个三元组:
R(U, F)
当且仅当U上的一个关系r满足F时,r称为关系模式 R(U, F)的一个关系
例子:
关系模式Student<U, F>中存在的问题:
结论:
# 3.分解关系模式
所以有了一个解决方法:
# 0x2.规范化
规范化理论正是用来指导改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
# 0.总览
# 1.函数依赖
定义:
# (1)平凡函数依赖与非平凡函数依赖
性质:
- 若X→Y,则X称为这个函数依赖的决定属性组,也称为决定因素(Determinant)
- 若X→Y,Y→X,则记作X←→Y。
- 若Y不函数依赖于X,则记作。
# (2)完全函数依赖与部分函数依赖
- 在R(U)中,如果X→Y,并且对于X的任何一个真子集X’,都有X’不推出Y, 则称Y对X完全函数依赖,记作 X F Y。
- 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X P Y
例子:
# (3)传递函数依赖
注意:其中的Z直接依赖于X所存在的条件如下:
(X←→Y)→Z,且Y⊈X
# 2.码
# (1)主属性与非主属性
- 包含在任何一个候选码中的属性 ,称为主属性(Prime attribute)
- 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
# (2)全码
- 整个属性组是码,称为全码(All-key) ,即这个码覆盖了所有属性
- 如果一个码是全码,那么只有一个候选码
例子:
# (3)外部码(外码)
# 0x3.范式
范式是对关系模式好坏的一个测度 我们需要把现实中杂乱的各种联系先形式化,然后极小化 根据极小化后的函数依赖集合,对关系模式进行分离 分离的程度及好坏又需要用范式去测量 分离有相应的算法 之后还可以考虑数据冗余的问题(多值依赖、4NF)
# 0.总览与范式之间的关系
各种范式之间存在联系:
# 1.第一范式1NF
老师说:所出的题一定满足第一范式,也就是说,只要是一个关系就满足第一范式。
# (1)定义:
# (2)问题:
而第一范式可能会有S-L-C类型关系模型,从而产生问题,用第二范式减轻。
# 2.第二范式2NF
# (1)定义:
即没有非主属性部分函数依赖于码。
ps:上述提到属性:学号(Sno),所在系(Sdept),系主任姓名(Mname)、课程号(Cno)、成绩(Grade)、学生宿舍楼号(Sloc)。
# (2)问题:
可能会有S-L类型关系模型,从而产生一些不便,用第三范式减轻。
# (3)改进:
可减轻S-L-C类型关系模型产生的错误。
修改1NF关系模式产生问题的例子:
相应的函数依赖图示如下:
因此就会产生一系列问题:
- 插入异常 (没选课的学生)
- 删除异常 (删除只选一门课的学生)
- 数据冗余度大 (k门课,Sdept Sloc重复存储k次)
- 修改复杂 (转系,本应只修改Sdept却还需修改Sloc)
因此S-L-C不是一个好的关系模式
原因:
Sdept、 Sloc部分函数依赖于码。
解决方法:
S-L-C分解为两个关系模式,以消除这些部分函数依赖 SC(Sno, Cno, Grade) S-L(Sno, Sdept, Sloc)
从而产生的函数依赖图:
因此采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
但是将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。
# 3.第三范式3NF
# (1)定义:
# (2)问题:
可能存在主属性对码的部分依赖和传递依赖
# (3)改进:
减轻了S-L类型关系模型数据操作时的错误。
修改2NF关系模式产生问题的例子:
如果有如下操作:
- 插入还没住处的人
- 修改系名要更新所有记录
就会产生各种问题
解决方法:
采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
将一个2NF关系分解为多个3NF的关系后,仍然不能完全消除关系模式中的各种异常情况和数据冗余。
# 4.BC范式(BCNF)
全码必定满足bc范式。
# (1)定义:
# (2)性质:
# (3)改进:
修改3NF关系模式产生问题的例子:
存在问题:
解决方法:
# 5.小结
一个数据库模式中的关系模式如果都属于BCNF,那么在函数依赖范畴内,它已实现了彻底的分离;已经消除插入和删除异常。
但是,我们还应当适度解决冗余问题;
当一个关系U属于第3范式时,且只有一个候选码,那么它也属于BC范式。
# 6.多值依赖
# 数据冗余例子:
[例6.9] 学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。每个教员可以讲授多门课程,每种参考书可以供多门课程使用。
而对应的关系为:
非规范化关系
用二维表表示Teaching
Teaching具有唯一候选码(C,T,B), 即全码。(这个例子中,C为X,T为Y,B为Z)
因此Teaching∈BCNF
Teaching模式中存在的问题 (1) 数据冗余度大 (2) 插入操作复杂 (3) 删除操作复杂 (4) 修改操作复杂
# 多值依赖定义:
设R(U)是一个属性集U上的一个关系模式, X、 Y和Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖 X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一==组==Y的值,这组值仅仅决定于x值而与z值无关(意思是只有z值没办法唯一确定y)
多值依赖的另一个等价的形式化的定义:
在R(U)的任一关系r中,如果存在元组t,s 使得t[X]=s[X],那么就必然存在元组 w,v∈r,(w,v可以与s,t相同),使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],v[Y]=s[Y],v[Z]=t[Z](即交换s,t元组的Y值所得的两个新元组必在r中),则Y多值依赖于X,记为X→→Y。 这里,X,Y是U的子集,Z=U-X-Y。
判定方法:对于任意关系中,如果存在两个元组(就是行),记为A,B,如果他们的某一属性X的值相等,那么我们交换它们另外的属性Y的值后,得到的新的两个元组,在表中是可以在原来的表中找到与它们相匹配的元组的。
例如:
在关系模式Teaching中,对于一个(物理,光学原理)有一组T值{李勇,王军},这组值仅仅决定于课程C上的值(物理)。也就是说对于另一个(物理,普通物理学)它对应的一组T值仍是{李勇,王军},尽管这时参考书B的值已经改变了。因此T多值依赖于C,即C→→T。
平凡多值依赖和非平凡的多值依赖:
- 若X→→Y,而Z=Φ,则称 X→→Y为平凡的多值依赖
- 否则称X→→Y为非平凡的多值依赖
# 性质:
对称性
若X→→Y,则X→→Z,其中Z=U-X-Y
传递性
若X→→Y,Y→→Z, 则X→→Z –Y
函数依赖是多值依赖的特殊情况。
若X→Y,则X→→Y。
若X→→Y,X→→Z,则X→→Y∪ Z。
若X→→Y,X→→Z,则X→→Y∩Z。
若X→→Y,X→→Z,则X→→Y-Z,X→→Z -Y。
# 多值依赖与函数依赖的区别:
(1) 多值依赖的有效性与属性集的范围有关(Z) (2) 若函数依赖X→Y在R(U)上成立,则对于任何Y'⊆Y均有X→Y' 成立 多值依赖X→→Y若在R(U)上成立,不能断言对于任何Y' ⊆ Y有X→→Y' 成立
# 7.第四范式4NF
# (1)定义:
关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈X),X都含有码,则R∈4NF。 (唯一性)
如果R ∈ 4NF, 则R ∈ [BCNF]
- 不允许有非平凡且非函数依赖的多值依赖
- 允许的非平凡多值依赖是函数依赖
例子:
# 8.规范化小结
关系数据库的规范化理论是数据库逻辑设计的工具
目的:尽量消除插入、删除异常,修改复杂,数据冗余(因为解决数据冗余可能会带来后期查询效率的降低)
基本思想:逐步消除数据依赖中不合适的部分
- 实质:概念的单一化
- 让一个关系描述一个概念、一个实体、实体间的一种联系
关系模式规范化的基本步骤:
规范化的缺点:
- 不能说规范化程度越高的关系模式就越好
- 在设计数据库模式结构时,必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式
- 上面的规范化步骤可以在其中任何一步终止
- 原因:连接问题会带来更大的查询代价
- 比如这个例子:Teaching(C,T,B)=CT(C, T) ∈ 4NF; CB(C, B) ∈ 4NF