问题的提出
关系数据库逻辑设计
- 针对具体问题,如何构造一个适合于它的数据模式
- 数据库逻辑设计的工具——关系数据库规范化理论
关系模式由五部分组成,是一个五元组:
R(U,D,DOM,F)
- 关系名R是符号化的元组语义
- U为一组属性
- D为属性组U中的属性所来自的域
- DOM为属性到域的映射
- F为属性组U上的一组数据依赖
由于D,DOM与模式设计关系不大,因此在学习关系数据理论的时候把管关系模式看做一个三元组R<U,F>
当且仅当U上的一个关系r满足F时,r成为关系模式R<U,F>的一个关系
作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)
数据依赖
- 是一个关系内部属性与属性之间的一种约束关系
- 通过属性间值的相等与否体现出来的数据间相互联系
- 是现实世界属性间相互联系的抽象
- 是数据内在的性质
- 是语义的体现
数据依赖的主要类型
- 函数依赖(FD)
- 多值依赖(MVD)
函数依赖普遍存在于现实生活中
函数依赖顾名思义,属性间的依赖关系就类似于数学函数中的y=f(x),唯一确定的x有唯一确定的y,即x的值决定了y的值,例如在表student中,Sno的值确定了,那么Sname的值就确定了,那么这个时候就可以说Sname函数依赖于Sno,记作Sno→Sname
Sno——学号,Sdept——所在系,Mname——系主任姓名,Cno——课程号,Grade——成绩
例如在表student中,关系模式的属性集合为:
U = {Sno,Sdept,Mname,Cno,Grade}
属性组U上的一组函数依赖F:
F = {Sno -> Sdept,Sdept -> Mname,(Sno,Cno) -> Grade}
关系模式为:
student<U,F>
缺点:
- 数据冗余
- 例如系主任的姓名反复出现
- 更新异常
- 如果更换系主任,那么需要修改和这个系所有相关元组
- 插入异常
- 如果一个系还没有学生,则无法输入系名称和系主任姓名
- 删除异常
- 如果删除整个系的学生,那么系和系主任的信息也会丢失
原因——存在与模式中的某些数据依赖引起的
解决方法——用规范化理论改造关系模式来消除其中不合适的数据依赖 ——>
S(Sno,Sdept,Sno -> Sdept);
SC(Sno,Cno,Grade,(Sno,Cno) -> Grade);
DEPT(Sdept,Mname,Sdept -> Mname);
规范化
函数依赖
函数依赖
设student(U)是属性集U上的关系模式,我们可以发现Sno,Sname是U的子集,因为对于student(U)的任意一个可能的关系r,r中不可能存在两个元组在Sno上的属性值相等,而在Sname上的属性值不等,则称Sno函数确定Sname或称Sname函数依赖于Sno,记作Sno -> Sname。
在上表中,函数依赖关系有
Sno -> Sname
Sno -> Sdept
Sno -> Mname
Sdept -> Mname
(Sno,Cno) -> Grade
假设不允许重名,则还有
Sname -> Sno
Sname -> Sdept
Sname -> Mname
(Sname,Cno) -> Grade
因为在不允许重名的约束条件下,有Sno -> Sname且Sname -> Sno,所以可以记为Sno <--> Sname
如果两个属性列之间不存在函数依赖关系,那么就在箭头上面加一个斜杠
函数依赖不是指关系模式的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件
平凡函数依赖与非平凡函数依赖
Y函数依赖于X,但是Y不包含于X,则称X -> Y是非平凡的函数依赖,如果Y包含于X,则为平凡的函数依赖
对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义
在函数依赖关系中,X成为这个函数依赖的决定属性组,也称为决定因素
完全函数依赖与部分函数依赖
如果Y函数依赖于X,而对于X的任意真子集都不存在函数依赖关系,那么称Y对X完全函数依赖,记作,否则称为部分函数依赖,记作
例如在表student中,Grade对(Sno,Cno)完全函数依赖,Sno,Cno都对(Sno,Cno)部分函数依赖,
传递函数依赖
如果Y非平凡的函数依赖于X,同时X不函数依赖于Y,Z函数依赖于Y,那么称Z对X传递函数依赖,记作,如果X和Y函数依赖于彼此,那么Z直接依赖于X
还是以表student为例,因为Sno <-->Sname,Sname -> Sdept,因此Sdept直接依赖于Sno,从表中也可以发现存在函数依赖关系Sno -> Sdept;因为Sno -> Sdept,Sdept ->Mname,因此Mname传递函数依赖于Sno
码
码是关系模式中的一个重要概念。
以表player为例,存在函数依赖关系:
pno -> pname;pno -> psex;pno -> page
在关系模式player<U,F>中,U完全函数依赖于pno,所以pno是player的一个候选码
以表student为例,因为U部分函数依赖于(Sno,Cno),所以(Sno,Cno)称为超码。因为U完全依赖于Sno和Cno,所以Sno和Cno都是候选码。候选码是最小的超码。
如果关系模式中有多个候选码,则选定其中一个作为主码。
包含在任何一个候选码中的属性称为主属性,不包含在任何候选码中的属性称为非主属性或非码属性。最简单的情况——单个属性是码,例如表player,只有pno是候选码。最极端的情况——全码,表中的所有属性都是候选码。
以表sc为例,sname和cname都是候选码,因此表sc属于全码
以表course为例,属性列cpno不是表course的码,是course的外码
主码与外码一起提供了表示关系间联系的手段
范式
关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。
范式是符合某一种级别的关系模式的集合
范式的种类
- 1NF
- 2NF
- 3NF
- BDNF
- 4NF
- 5NF
各种范式之间存在的联系如上图所示
某一关系模式R为第n范式,可简记为R∈nNF
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这总过程叫做规范化
在1NF下,R中所有属性都是不可分的基本数据项,R∉1NF => R不能称为关系数据库
R∈1NF ≠ 一个好的关系模式
2NF
如果一个关系不属于2NF,即R∈1NF或R不是关系数据库,那么
- 插入异常
- 删除异常
- 修改复杂
原因——有非主属性部分函数依赖于码
解决方法——投影分解消除部分函数依赖——将一个表分为几个表,每个表中只有码,完全函数依赖于码的非主属性
3NF
投影分解消除传递函数依赖
BCNF
通常被认为是修正的第三范式/扩充的第三范式
性质:
- 所有非主属性都完全函数依赖于每个候选码
- 所有主属性都完全依赖与每个不包含它的候选码
- 没有任何属性完全函数依赖于非码的任何一组属性
如果一个关系数据库中的所有关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了插入异常和删除异常
以表player为例:
- 只有一个码pno,没有部分函数依赖于pno的属性列,没有传递函数依赖于pno的属性列,因此player∈3NF
- pno是表player中唯一的决定性因素,因此player∈BCNF
多值依赖
规范化的二维表teacher
全码,属于BCNF
缺点:
- 数据冗余度大
- 增加操作复杂
- 删除操作复杂
- 修改操作复杂
原因——多值依赖
属性集U上有子集X,Y,Z,其中Z=U-X-Y,关系模式R(U)中多值依赖X ->->Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关,例如对于给定的(courses,books),具有一组teachers的值,因为每个老师所使用的书一样,所以books的值不能决定teachers的值,因此teachers多值依赖与courses,即courses->->teachers
还有一种定义,但是我觉得没有这个定义清晰,反正我没太看懂,就不写了,可以自行看书《数据库系统概论》P186
若X->->Y,而Z=∅,即Z为空集,则称为平凡的多值依赖,否则称为非平凡的多值依赖
性质:
- 对称性——若X->->Y,则X->->Z,其中Z=Y-X-Y
- 传递性——若X->->Y,X->->Z,则X->->Z-Y
- 函数依赖是多值依赖的特殊情况,若X->Y,则X->->Y
- 若X->->Y,X->->Z,则X->->YZ
- 若X->->Y,X->->Z,则X->->Y∩Z
- 若X->->Y,X->->Z,则X->->Z-Y,X->->Y-Z
多值依赖vs函数依赖
- 多值依赖的有效性和属性集的范围有关
- 若X->->Y在U上成立,则在W(XY
W
U)上一定成立;如果X->->Y在W(W
U)上成立,在U上不一定成立——多值依赖的定义中不仅涉及属性组X和Y,而且涉及U中中其余属性Z
- 一般的在R(U)上若有X->->Y在W(W
U)上成立,则称X->->Y为R(U)的嵌入型多值依赖
- 函数依赖X->Y的有效性仅取决于X,Y这两个属性集的值
- 只要在R(U)的任何一个关系中,元组在X和Y上的值满足定义,则函数依赖X->Y在任何属性集W (XY
W
U)上成立
- 若X->->Y在U上成立,则在W(XY
- 若函数依赖成立,则对于任何Y的真子集函数依赖都成立,但是多值依赖不能这么判定
4NF
对于一个关系模式,如果每个非平凡的多值依赖,X都含有码,则R<U,F>∈4NF
4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。4NF所允许的非平凡多值依赖实际上是函数依赖
如果一个关系模式是4NF,则必为BCNF
例如在表teacher中,因为courses不是码,关系模式是全码,所以只属于BCNF而非4NF
数据依赖的公理系统
数据依赖的公理系统是模式分解算法理论基础,函数依赖的一个有效而完备的公理系统是Armstrong公理系统
对于满足一组函数依赖F的关系考试R<U,F>,其任何一个关系r,若函数依赖X->Y都成立,则称F逻辑蕴涵X->Y
Armstrong公理系统
- 一套推理规则,是模式分解算法的理论基础
- 用途
- 求给定关系模式的码
- 从一组函数依赖求得蕴含的函数依赖
推理规则:
- 自反律——若Y
X
U,则X->Y为F所蕴含——平凡的函数依赖,使用不依赖于F
- 增广律——若X->Y为F所蕴含且Z
U,则XZ->YZ为F所蕴含
- 传递律——若X->Y即Y->Z为F所蕴含,则X->Z为F所蕴含
由上可得:
- 合并规则——X->Y,X->Z=>X->YZ
- 伪传递规则——X->Y,WU->Z=>XW->Z
- 分解规则——X->Y,Z
Y=>X->Z
由合并规则和伪传递规则可得X->A1A2A3A4A5···Ak成立的充要条件是X->Ai成立
关系模式中为F所逻辑蕴涵的函数依赖的全体叫做F的闭包,记为F+
XF+={A|X->A能由F根据Armstrong公理导出},XF+成为属性集X关于函数依赖集F的闭包
X->Y能由Armstrong公理导出的充要条件是YXF+,这样判定X->Y能否由Armstrong公理导出的问题就转化为求XF+,判定Y是否为XF+的子集的问题
求闭包的步骤是迭代——
由F出发根据Armstrong公理推导出来的每一个函数依赖一定在F+中
F+中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来
如果G+=F+,就说明函数依赖集F覆盖G,或F与G等价
如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集,亦称为最小依赖集或最小覆盖
- F中任一函数依赖的右部仅含有一个属性
- F中不存在这样的函数依赖X->A,X使得F与F-{X->A}等价,即F中的函数依赖均不能由F中其它函数依赖导出
- F中不存在这样的函数依赖X->A,X有真子集Z使得F-{X->A}∪{Z->A}与F等价,即F中各函数依赖左部均为最小属性集,不存在冗余属性
每一个函数依赖集F均等价于一个极小函数依赖集Fm,Fm不一定是唯一的