1
第 7章 关系数据库理论
2
本章概要
? 前面已经讲述了 关系数据库, 关系模型 的基本概念以
及关系数据库的 标准语言 。
? 如何使用关系模型设计关系数据库,也就是面对一个
现实问题,如何选择一个比较好的关系模式的集合,
每个关系又应该由哪些属性组成。这属于数据库设计
的问题,确切地讲是数据库 逻辑设计 的问题,有关数
据库设计的全过程将在第 6章详细讨论。
? 本章讲述 关系数据库规范化理论,这是数据库逻辑设
计的理论依据。
? 要求了解规范化理论的研究动机及其在数据库设计中的作用,
? 掌握函数依赖的有关概念,
? 第一范式、第二范式、第三范式的定义,
? 重点掌握并能够灵活运用关系模式规范化的方法和关系模式
分解的方法,这也是本章的难点。
3
规范化问题的提出
规范化理论的主要内容
?关系数据库的规范化理论最早是由关系数据库
的创始人 E.F.Codd提出的,
?后经许多专家学者对关系数据库理论作了深入
的研究和发展, 形成了一整套有关关系数据库
设计的理论 。
?在该理论出现以前, 层次和网状数据库的设计
只是遵循其模型本身固有的原则, 而无具体的
理论依据可言, 因而带有盲目性, 可能在以后
的运行和使用中发生许多预想不到的问题 。
4
?在关系数据库系统中,关系模型 包括一组 关系
模式,各个关系不是完全孤立的,数据库的设
计较层次和网状模型更为重要。
?如何设计一个适合的关系数据库系统,关键是
关系数据库 模式 的设计,一个好的关系数据库
模式应该包括多少 关系模式,而每一个关系模
式又应该包括哪些 属性,又如何将这些相互关
联的关系模式组建一个适合的 关系模型,这些
工作决定了到整个系统运行的效率,也是系统
成败的关键所在,所以必须在关系数据库的 规
范化理论 的指导下逐步完成。
5
? 关系数据库的规范化理论主要包括三个方面的内容:
? 函数依赖
? 范式 ( Normal Form)
? 模式设计
? 其中, 函数依赖 起着核心的作用, 是模式分解和模式
设计的基础, 范式是模式分解的标准 。
4.1.2 关系模式的存储异常问题
? 数据库的逻辑设计为什么要遵循一定的规范化理论?
? 什么是好的关系模式?
? 某些不好的关系模式可能导致哪些问题?
? 下面通过例子进行分析,
6
例如, 要求设计 教学管理数据库, 其关系模式 SCD如下:
SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE)
? 其中, SNO表示学生学号, SN表示学生姓名, AGE表示
学生年龄, DEPT表示学生所在的系别, MN表示系主任
姓名, CNO表示课程号, SCORE表示成绩 。
根据实际情况, 这些数据有如下语义规定:
1,一个系有若干个学生, 但一个学生只属于一个系;
2,一个系只有一名系主任, 但一个系主任可以同时兼几个系的
系主任;
3,一个学生可以选修多门功课, 每门课程可有若干学生选修;
4,每个学生学习课程有一个成绩 。
? 在此关系模式中填入一部分具体的数据, 则可得到 SCD
关系模式的实例, 即一个教学管理数据库, 如图 4.1所
示 。
7
图 4.1 关系 SCD
SNO SN AGE DEPT MN CNO SCORE
S1 赵亦 17 计算机 刘伟 C1 90
S1 赵亦 17 计算机 刘伟 C2 85
S2 钱尔 18 信息 王平 C5 57
S2 钱尔 18 信息 王平 C6 80
S2 钱尔 18 信息 王平 C7 70
S2 钱尔 18 信息 王平 C5 70
S3 孙珊 20 信息 王平 C1 0
S3 孙珊 20 信息 王平 C2 70
S3 孙珊 20 信息 王平 C4 85
S4 李思 男 自动化 刘伟 C1 93
8
?根据上述的语义规定, 并分析以上关系中的数据, 我们
可以看出,(SNO,CNO)属性的组合能唯一标识一个元组,
所以 (SNO,CNO)是该关系模式的 主关系键 。 但在进行数
据库的操作时, 会出现以下几方面的问题 。
1,数据冗余 。 每个系名和系主任的名字存储的次数等
于该系的学生人数乘以每个学生选修的课程门数, 同
时学生的姓名, 年龄也都要重复存储多次, 数据的冗
余度很大, 浪费了存储空间 。
2,插入异常 。 如果某个新系没有招生, 尚无学生时,
则系名和系主任的信息无法插入到数据库中 。
? 因为在这个关系模式中, (SNO,CNO)是主关系键 。 根
据关系的 实体完整性约束, 主关系键的值不能为空,
而这时没有学生, SNO和 CNO均无值, 因此不能进行插
入操作 。
? 另外, 当某个学生尚未选课, 即 CNO未知, 实体完整
性约束还规定, 主关系键的值不能部分为空, 同样不
能进行插入操作 。
9
3,删除异常 。
?某系学生全部毕业而没有招生时, 删除全部学生的
记录则系名, 系主任也随之删除, 而这个系依然存在,
在数据库中却无法找到该系的信息 。
?另外, 如果某个学生不再选修 C1课程, 本应该只删
去 C1,但 C1是主关系键的一部分, 为保证实体完整性,
必须将整个元组一起删掉, 这样, 有关该学生的其它
信息也随之丢失 。
4,更新异常 。
?如果学生改名, 则该学生的所有记录都要逐一修改
SN;
?又如某系更换系主任, 则属于该系的学生记录都要
修改 MN的内容, 稍有不慎, 就有可能漏改某些记录,
这就会造成数据的不一致性, 破坏了数据的完整性 。
10
? 由于存在以上问题, 我们说, SCD是一个不好的关系模
式 。 产生上述问题的原因, 直观地说, 是因为关系中
,包罗万象,, 内容太杂了 。
? 那么, 怎样才能得到一个好的关系模式呢?
? 我们把关系模式 SCD分解为下面三个结构简单的关系模
式, 如图 4.2所示 。
?学生关系 S(SNO,SN,AGE,DEPT)
?选课关系 SC(SNO,CNO,SCORE)
?系关系 D(DEPT,MN)
11
S SCSNO SN AGE DEPT SNO CNO SCORE
S1 赵亦 17 计算机 S1 C1 90
S2 钱尔 18 信息 S1 C2 85
S3 孙珊 20 信息 S2 C5 57
S4 李思 21 自动化 S2 C6 80
S2 C7
D
S2 C5 70
DEPT MN S3 C1 0
计算机 刘伟 S3 C2 70
信息 王平 S3 C4 85
自动化 刘伟 S4 C1 93
图 4.2 分解后的关系模式
12
?在以上三个关系模式中,实现了信息的某种程度
的分离,
?S中存储学生基本信息,与所选课程及系主任无关;
?D中存储系的有关信息,与学生无关;
?SC中存储学生选课的信息,而与所学生及系的有关信息
无关。
?与 SCD相比,分解为三个关系模式后,数据的冗余
度明显降低。
?当新插入一个系时,只要在关系 D中添加一条记录。
?当某个学生尚未选课,只要在关系 S中添加一条学生记
录,而与选课关系无关,这就避免了 插入异常 。
?当一个系的学生全部毕业时,只需在 S中删除该系的全
部学生记录,而关系 D中有关该系的信息仍然保留,从
而不会引起 删除异常 。
?同时,由于数据冗余度的降低,数据没有重复存储,也
不会引起 更新异常 。
13
?经过上述分析, 我们说分解后的关系模式是一
个好的关系数据库模式 。
?从而得出结论, 一个好的关系模式应该具备以
下四个条件:
1,尽可能少的数据冗余 。
2,没有插入异常 。
3,没有删除异常 。
4,没有更新异常 。
14
? 但要注意, 一个好的关系模式并不是在任何情况下都是
最优的,
? 比如查询某个学生选修课程名及所在系的系主任时, 要通过连
接, 而连接所需要的系统开销非常大, 因此要以实际设计的目
标出发进行设计
? 如何按照一定的规范设计关系模式,将结构复杂的关系
分解成结构简单的关系,从而把不好的关系数据库模式
转变为好的关系数据库模式,这就是 关系的规范化 。
? 规范化又可以根据不同的要求而分成若干级别。
? 我们要设计的关系模式中的各属性是相互依赖、相互制
约的,这样才构成了一个结构严谨的整体。
? 因此在设计关模式时,必须从语义上分析这些 依赖关系 。
? 数据库模式的好坏和关系中各属性间的依赖关系有关,
因此,我们先讨论属性间的依赖关系,然后再讨论关系
规范化理论。
15
函数依赖
函数依赖的定义及性质
? 关系模式中的各属性之间相互依赖, 相互制约的联系
称为 数据依赖 。
? 数据依赖一般分为 函数依赖, 多值依赖 和 连接依赖 。
? 其中,函数依赖 是最重要的数据依赖 。
? 函数依赖 ( Functional Dependency) 是关系模式中属
性之间的一种 逻辑依赖关系 。
? 例如在上一节介绍的关系模式 SCD中, SNO与 SN,AGE,DEPT之
间都有一种依赖关系 。
? 由于一个 SNO只对应一个学生, 而一个学生只能属于一个系,
所以当 SNO的值确定之后, SN,AGE,DEPT的值也随之被唯一
的确定了 。
? 这类似于变量之间的 单值函数关系 。 设单值函数 Y=F(X),自
变量 X的值可以决定一个唯一的函数值 Y。
? 在这里, 我们说 SNO决定函数 ( SN,AGE,DEPT), 或者说
( SN,AGE,DEPT) 函数依赖于 SNO。
16
下面给函数依赖的形式化定义。
函数依赖的定义
定义 设关系模式 R(U,F),U是属性全集, F是 U上的函
数依赖集, X和 Y是 U的子集, 如果对于 R(U)的任意一个可
能的关系 r,对于 X的每一个具体值, Y都有唯一的具体值
与之对应, 则称 X决定函数 Y,或 Y函数依赖于 X,记作
X→Y 。 我们称 X为 决定因素, Y为 依赖因素 。 当 Y不函数依
赖于 X时, 记作,X Y。 当 X→Y 且 Y→X 时, 则记作,X Y。
?对于关系模式 SCD
U={SNO,SN,AGE,DEPT,MN,CNO,SCORE}
F={SNO→SN, SNO→AGE, SNO→DEPT}
?一个 SNO有多个 SCORE的值与其对应, 因此 SCORE不能唯
一地确定, 即 SCORE不能函数依赖于 SNO,所以有:
SNO SCORE。
?但是 SCORE可以被( SNO,CNO)唯一地确定。所以可表
示为:( SNO,CNO) → SCORE。
?
17
有关函数依赖的几点说明:
1,平凡的函数依赖与非平凡的函数依赖 。
? 当属性集 Y是属性集 X的子集时, 则必然存在着函数依赖 X→Y,
这种类型的函数依赖称为平凡的函数依赖 。
? 如果 Y不是 X的子集, 则称 X→Y 为非平凡的函数依赖 。
? 若不特别声明, 我们讨论的都是非平凡的函数依赖 。
2,函数依赖是语义范畴的概念 。
? 我们只能根据语义来确定一个函数依赖, 而不能按照其形式
化定义来证明一个函数依赖是否成立 。
? 例如, 对于关系模式 S,当学生不存在重名的情况下, 可以得
到:
SN→AGE
SN→DEPT
? 这种函数依赖关系,必须是在没有重名的学生条件下才成立
的,否则就不存在函数依赖了。
? 所以函数依赖反映了一种语义完整性约束。
18
3,函数依赖与属性之间的联系类型有关 。
( 1) 在一个关系模式中, 如果属性 X与 Y有 1:1联系时, 则存在
函数依赖 X→Y, Y→X, 即 X Y。
例如, 当学生无重名时, SNO SN。
( 2) 如果属性 X与 Y有 1:m的联系时, 则只存在函数依赖 X→Y 。
例如, SNO与 AGE,DEPT之间均为 1:m联系, 所以有
SNO→AGE, SNO→DEPT 。
( 3) 如果属性 X与 Y有 m,n的联系时, 则 X与 Y之间不存在任何函
数依赖关系 。
例如, 一个学生可以选修多门课程, 一门课程又可以为多
个学生选修, 所以 SNO与 CNO之间不存在函数依赖关系 。
?由于函数依赖与属性之间的联系类型有关,所以在确
定属性间的函数依赖关系时,可以从分析 属性间的联系
类型 入手,便可确定属性间的函数依赖。
?
?
19
4,函数依赖关系的存在与时间无关 。
?因为函数依赖是指关系中的所有元组应该满足的约
束条件,而不是指关系中某个或某些元组所满足的
约束条件。
?当关系中的元组增加、删除或更新后都不能破坏这
种函数依赖。
?因此,必须根据语义来确定属性之间的函数依赖,
而不能单凭某一时刻关系中的实际数据值来判断。
?例如,对于关系模式 S,假设没有给出无重名的学
生这种语义规定,则即使当前关系中没有重名的记
录,也只能存在函数依赖 SNO→ SN,而不能存在函
数依赖 SN→ SNO,因为如果新增加一个重名的学生,
函数依赖 SN→ SNO必然不成立。
?所以函数依赖关系的存在 与时间无关,而只与数据
之间的 语义规定 有关。
20
5,函数依赖可以保证关系分解的无损连接性 。
?设 R( X,Y,Z), X,Y,Z为不相交的属性集合,
如果 X→Y 或 X→Z,则有 R(X,Y,Z)=R[X,Y]*R[X,
Z],
?其中, R[X,Y]表示关系 R在属性 ( X,Y) 上的投影,
即 R等于其投影在 X上的自然连接, 这样便保证了关
系 R分解后不会丢失原有的信息, 称作 关系分解的
无损连接性 。
?例如,对于关系模式 SCD,有 SNO→ ( SN,AGE,
DEPT,MN),SCD( SNO,SN,AGE,DEPT,MN,CNO,
SCORE) =SCD[SNO,SN,AGE,DEPT,MN]*SCD[SNO,
CNO,SCORE],也就是说,用其投影在 SNO上的自然
连接可复原关系模式 SCD。
?这一性质非常重要,在后一节的 关系规范化 中要用
到。
21
函数依赖的基本性质
1,投影性 。
? 根据平凡的函数依赖的定义可知, 一组属性函数决定它的所有子集 。
? 例如, 在关系 SCD中, ( SNO,CNO) → SNO和 ( SNO,CNO) → CNO。
2,扩张性 。
? 若 X→Y 且 W→Z, 则 ( X,W) → ( Y,Z) 。
? 例如, SNO→ ( SN,AGE), DEPT→MN, 则有 ( SNO,DEPT) → ( SN,
AGE,MN) 。
3,合并性 。
? 若 X→Y 且 X→Z 则必有 X→ ( Y,Z) 。
? 例如, 在关系 SCD中, SNO→ ( SN,AGE), SNO→ ( DEPT,MN), 则有
SNO→ ( SN,AGE,DEPT,MN) 。
4,分解性 。
? 若 X→ ( Y,Z),则 X→Y 且 X→Z 。 很显然, 分解性为合并性的逆过程 。
? 由合并性和分解性, 很容易得到以下事实:
X→A 1,A2,…,An成立的充分必要条件是 X→A i( i=1,2,…,n)成立。
22
完全函数依赖与部分函数依赖
定义 4.2 设关系模式 R(U),U是属性全集, X和 Y是 U的子
集,
? 如果 X→Y, 并且对于 X的任何一个真子集 X′,都有 X′ Y,则
称 Y对 X完全函数依赖 ( Full Functional Dependency), 记作
X Y。
? 如果对 X的某个真子集 X′, 有 X′ →Y, 则称 Y对部分函数依赖
( PartialFunctionalDependency), 记作 X Y。
? 例如, 在关系模式 SCD中, 因为 SNO SCORE,且 CNO SCORE,
所以有,( SNO,CNO) SCORE 。
而 SNO→AGE, 所以 ( SNO,CNO) AGE。
? 由定义 4.2可知:
? 只有当决定因素是组合属性时,讨论部分函数依赖才有意义,
? 当决定因素是单属性时,只能是完全函数依赖。
? 例如,在关系模式 S( SNO,SN,AGE,DEPT),决定因素为单
属性 SNO,有 SNO→ ( SN,AGE,DEPT),不存在部分函数依赖。
? ?? f
? ?? p
? ?? f
? ?? p
23
传递函数依赖
定义 4.3 设有关系模式 R( U), U是属性全集,
X,Y,Z是 U的子集,
? 若 X→Y, 但 Y X,而 Y→Z ( Y X,Z Y), 则称 Z对 X传递函
数依赖 ( Transitive Functional Dependency), 记作,X Z。
? 如果 Y→X, 则 X Y,这时称 Z对 X直接函数依赖, 而不是传递
函数依赖 。
? 例如, 在关系模式 SCD中, SNO→DEPTN, 但 DEPTN SNO,而
DEPTN→MN, 则有 SNO MN。 当学生不存在重名的情况下, 有
SNO→SN, SN→SNO, SNO SN,SN→DEPTN, 这时 DEPTN对 SNO
是 直接函数依赖, 而不是传递函数依赖 。
? 综上所述, 函数依赖分为 完全函数依赖, 部分函数依赖 和 传
递函数依赖 三类, 它们是规范化理论的依据和规范化程度的
准则, 下面我们将以介绍的这些概念为基础, 进行数据库的
规范设计 。
? ?
? ?? t
?
? ?? t
?
24
范式
? 规范化的 基本思想 是消除关系模式中的数据冗余,消
除数据依赖中的不合适的部分,解决数据插入、删除
时发生异常现象。
? 这就要求关系数据库设计出来的关系模式要满足一定
的条件。
? 我们把关系数据库的规范化过程中为不同程度的规范
化要求设立的不同标准称为 范式 ( Normal Form)。
? 由于规范化的程度不同,就产生了 不同的范式 。
? 满足最基本规范化要求的关系模式叫 第一范式,
? 在第一范式中进一步满足一些要求为 第二范式,
? 以此类推就产生了 第三范式 等概念。
? 每种范式都规定了一些限制约束条件。
25
?范式的概念最早由 E.F.Codd提出 。
?从 1971年起, Codd相继提出了关系的三级规范化形式,
即第一范式 ( 1NF), 第二范式 ( 2NF), 第三范式 ( 3NF) 。
?1974年, Codd和 Boyce以共同提出了一个新的范式的概念,
即 Boyce-Codd范式, 简称 BC范式 。
?1976年 Fagin提出了第四范式,
?后来又有人定义了第五范式 。
?至此在关系数据库规范中建立了一个范式系列:
1NF,2NF,3NF,BCNF,4NF,5NF,一级比一级有更严格的要求 。
?各个范式之间的联系可以表示为:
5NF 4NF BCNF 3NF 2NF 1NF
?如图 4.3所示。
? ? ? ? ?
26
图 4.3 各种范式之间的关系
下面逐一介绍各级范式及其规范化。
27
第一范式
?第一范式 ( First Normal Form) 是最基本的规
范形式, 即关系中每个属性都是不可再分的简单
项 。
定义 4.4 如果关系模式 R,其所有的属性均为简
单属性, 即每个属性都城是不可再分的, 则称 R
属于第一范式, 简称 1NF,记作 R?1NF。
?在第 2章讨论关系的性质时,我们把满足这个条件的关
系称为 规范化关系 。
?在关系数据库系统中只讨论规范化的关系,凡是非规
范化的关系模式必须化成规范化的关系。
?在非规范化的关系中去掉组合项就能化成规范化的关
系。
?每个规范化的关系都属于 1NF,这也是它之所以称为
,第一, 的原因。
28
?然而, 一个关系模式仅仅属于第一范式是不
适用的 。
?在 4.1节中给出的关系模式 SCD属于第一范式,
但其具有大量的数据冗余, 具有插入异常, 删
除异常, 更新异常等弊端 。
?为什么会存在这种问题呢?
?让我们分析一下 SCD中的函数依赖关系, 它的
关系键是 ( SNO,CNO) 的属性组合, 所以有:
( SNO,CNO) SCORE
SNO→SN, ( SNO,CNO) SN
SNO→AGE, ( SNO,CNO) AGE
SNO→DEPT, ( SNO,CNO) DEPT
SNO MN,( SNO,CNO) MN
? ?? f
? ?? p
? ?? p
? ?? p
? ?? p? ?? t
29
我们可以用函数信赖图表示以上函数依赖关系,如图 4.4所示。
SDN
MN
SNO
图 4.4 SCD中的函数依赖关系
SNO
CNO
P
P
f
?由此可见,在 SCD中,既存在完全函数依赖,又存在部分函数依赖
和传递函数依赖。
?这种情况往往在数据库中是不允许的,也正是由于关系中存在着复
杂的函数依赖,才导致数据操作中出现了种弊端。
?克服这些弊端的方法是用投影运算将关系分解,去掉过于复杂的函
数依赖关系,向更高一级的范式进行转换。
30
第二范式
第二范式的定义
定义 4.5 如果关系模式 R?1NF,且每个非主属性都完全
函数依赖于 R的每个关系键, 则称 R属于 第二范式
( Second Normal Form), 简称 2NF,记作 R?2NF。
?在关系模式 SCD中,SNO,CNO为主属性,AGE,DEPT,
MN,MN,SCORE均为非主属性,经上述分析,存在非主属
性对关系键的部分函数依赖,所以 SCD2NF。
?而如图 4.2所示的由 SCD分解的三个关系模式 S,D,SC,
其中 S的关系键为 SNO,D的关系键为 DEPT,都是单属性,
不可能存在部分函数依赖。
?而对于 SC,( SNO,CNO) SCORE。所以 SCD分解后,
消除了非主属性对关系键的部分函数依赖,S,D,SC均
属于 2NF。
? ?? f
31
?又如在 2.4.2中, 讲述全码的概念时给出的关
系模式 TCS( T,C,S),
?一个教师可以讲授多门课程, 一门课程可以为多个
教师讲授,
?同样一个学生可以选听多门课程, 一门课程可以为
多个学生选听,
?(T,C,S)三个属性的组合是关系键, T,C,S都是主属
性, 而无非主属性, 所以也就不可能存在非主属性
对关系键的部分函数依赖, TCS?2NF。
?经以上分析, 可以得到两个结论:
1,从 1NF关系中消除非主属性对关系键的部分函数依
赖, 则可得到 2NF关系 。
2,如果 R的关系键为单属性, 或 R的全体属性均为主
属性, 则 R?2NF。
32
2NF规范化
?2NF规范化是指把 1NF关系模式通过投影分解转换成 2NF
关系模式的集合 。
?分解时遵循的基本原则就是, 一事一地,, 让一个关
系只描述一个实体或者实体间的联系 。 如果多于一个实
体或联系, 则进行投影分解 。
?下面以关系模式 SCD为例, 来说明 2NF规范化的过程
例 4.1 将 SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE)规范到
2NF。
? 由 SNO→SN, SNO→AGE, SNO→DEPT,( SNO,CNO) SCORE,
可以判断,关系 SCD至少描述了两个实体,
? 一个为学生实体,属性有 SNO,SN,AGE,DEPT,MN;
? 另一个是学生与课程的联系(选课),属性有 SNO,CNO和
SCORE。
? 根据分解的原则,我们可以将 SCD分解成如下两个关系,如图
4.5所示。
? ?? f
33
SD(SNO,SN,AGE,DEPT,MN),描述学生实体;
SC(SNO,CNO,SCORE),描述学生与课程的联系 。
SD SNO SN AGE DEPT MN
S1 赵亦 17 计算机 刘伟
S2 钱尔 18 信息 王平
S3 孙珊 20 信息 王平
S4 李思 21 自动化 刘伟
SC SNO CNO SCORES1 C1 90
S1 C2 85
S2 C5 57
S2 C6 80
S2 C7
S2 C5 70
S3 C1 0
S3 C2 70
S3 C4 85
S4 C1 93 图 4.5 关系 SD和 SC
34
? 对于分解后的两个关系 SD和 SC,主键分别为 SNO和
( SNO,CNO),非主属性对主键完全函数依赖。因此,
SD?2NF,SC?2NF,而且前面已经讨论,SCD的这种分
解没有丢失任何信息,具有无损连接性。
? 分解后,SD和 SC的函数依赖分别如图 4.6和 4.7所示。
SNO
SN SNO
CNO
SCOREAGE
DEPT
MN
图 4.6 SD中的函数依赖关系 图 4.7 SC中的函数依赖关系
35
? 1NF的关系模式经过投影分解转换成 2NF后,消除了一
些数据冗余。
? 分析图 4.5中 SD和 SC中的数据,可以看出,它们存储的
冗余度比关系模式 SCD有了较大辐度的降低。
? 学生的姓名、年龄不需要重复存储多次。
? 这样便可在一定程度上避免数据更新所造成的数据不
一致性的问题。
? 由于把学生的基本信息与选课信息分开存储,则学生
基本信息因没选课而不能插入的问题得到了解决,插
入异常现象得到了部分改善。
? 同样,如果某个学生不再选修 C1课程,只在选课关系
SC中删去该该学生选修 C1的记录即可,而 SD中有关该
学生的其它信息不会受到任何影响,也解决了部分删
除异常问题。
? 因此可以说关系模式 SD和 SC在性能上比 SCD有了显著提
高。
36
下面对 2NF规范化作 形式化的描述 。
?设关系模式 R( X,Y,Z), R?1NF,但 R2NF,
其中, X是 键属性, Y,Z是 非键属性, 且存在
部分函数依赖, X Y。 设 X可表示为 X1,X2,
其中 X1 Y。 则 R( X,Y,Z) 可以分解为
R[X1,Y]和 R[X,Z]。
?因为 X1→Y, 所以 R(X, Y, Z)=R[X1,
Y]*R[X1,X2,Z]=R[X1,Y]*R[X,Z],即 R等
于其投影 R[X1,Y]和 [X,Z]在 X1上的 自然连接,
R的分解具有 无损连接性 。
?由于 X1 Y,因此 R[X1,Y]?2NF。若 R[X,
Z]2NF,可以按照上述方法继续进行投影分解,
直到将 R[X,Z]分解为属于 2NF关系的集合,且
这种分解必定是有限的。
? ?? p
? ?? f
? ?? f
37
2NF的缺点
?2NF的关系模式解决了 1NF中存在的一些问题, 2NF规范
化的程度比 1NF前进了一步, 但 2NF的关系模式在进行数
据操作时, 仍然存在着一些问题:
1,数据冗余 。 每个系名和系主任的名字存储的次数等于该系的
学生人数 。
2,插入异常 。 当一个新系没有招生时, 有关该系的信息无法插
入 。
3,删除异常 。 某系学生全部毕业而没有招生时, 删除全部学生
的记录也随之删除了该系的有关信息 。
4,更新异常 。 更换系主任时, 仍需改动较多的学生记录 。
?之所以存在这些问题,是由于在 SCD中存在着非主属性
对主键的传递依赖。
?分析 SCD中的函数依赖关系,SNO→SN, SNO→AGE,
SNO→DEPT, DEPT→MN, SNO MN,非主属性 MN对主键
SNO传递依赖。
?为此,对关系模式 SCD还需进一步简化,消除这种传递
依赖,得到 3NF。
? ?? t
38
第三范式
第三范式的定义
定义 4.6 如果关系模式 R?2NF,且每个非主属性都不传
递依赖于 R的每个关系键, 则称 R属于第三范式 ( Third
Normal Form), 简称 3NF,记作 R?3NF。
?第三范式具有如下性质:
1,如果 R?3NF,则 R也是 2NF。
? 证明,3NF的另一种等价描述是:对于关系模式 R,不存在如
下条件的函数依赖,X→Y ( Y X),Y→Z,其中 X是键属性,
Y是任意属性组,Z是非主属性,Z Y。在此定义下,令 Y X,
Y是 X的真子集,则以上条件 X→Y, Y→Z 就变成了非主属性对
键 X的部分函数依赖,X Z。但由于 3NF中不存在这样的函
数依赖,所以 R中不可能存在非主属性对键 X的部分函数依赖,
R必定是 2NF。
? ?
? ?? p
39
2,如果 R?2NF,则 R不一定是 3NF。
?例如,我们前面由关系模式 SCD分解而得到的 SD和
SC都为 2NF,其中,SC?3NF,但在 SD中存在着非主
属性 MN对主键 SNO传递依赖,SD3NF。对于 SD,应该
进一步进行分解,使其转换成 3NF。
3NF规范化
?3NF规范化 是指把 2NF关系模式通过投影分解转换成 3NF
关系模式的集合 。
?和 2NF的规范化时遵循的原则相同, 即, 一事一地,,
让一个关系只描述一个实体或者实体间的联系 。
?下面以 2NF关系模式 SD为例,来说明 3NF规范化的过程。
40
例 4.2 将 SD(SNO,SN,AGE,DEPT,MN)规范到 3NF。
? 分析 SD的属性组成, 可以判断, 关系 SD实际上描
述了两个实体:
? 一个为学生实体, 属性有 SNO,SN,AGE,DEPT;
? 另一个是系的实体, 其属性 DEPT和 MN。
?根据分解的原则, 我们可以将 SD分解成如下两个关
系, 如图 4.8所示 。
S(SNO,SN,AGE,DEPT),描述学生实体;
D(DEPT,MN),描述系的实体。
41
S D
SNO SN AGE DEPT DEPT MN
S1 赵亦 17 计算机 计算机 刘伟
S2 钱尔 18 信息 信息 王平
S3 孙珊 20 信息 自动化 刘伟
S4 李思 21 自动化
?对于分解后的两个关系 S和 D,主键分别为 SNO和 DEPT,
不存在非主属性对主键的传递函数依赖 。 因此, S?3NF,
D?3NF。
图 4.8 关系 S和 D
42
? 分解后, S和 D的函数依赖分别如图 4.9和 4.10所示 。
SNO
SN
DEPTAGE
DEPT
MN
图 4.9 S中的函数依赖关系图 图 4.10 D中的函数依赖关系图
由以上两图可以看出, 关系模式 SD由 2NF分解为 3NF后, 函数依赖关系变得
更加简单, 既没有非主属性对键的部分依赖, 也没有非主属性对键的传递
依赖, 解决了 2NF中存在的四个问题 。
43
1,数据冗余降低 。 系主任的名字存储的次数与该系的学生人数无关, 只在
关系 D中存储一次 。
2,不存在插入异常 。 当一个新系没有学生时, 该系的信息可以直接插入到
关系 D中, 而与学生关系 S无关 。
3,不存在删除异常 。 要删除某系的全部学生而仍然保留该系的有关信息时,
可以只删除学生关系 S中的相关学生记录, 而不影响系关系 D中的数据 。
4.不存在更新异常。更换系主任时,只需修改关系 D中一个相应元组的 MN
属性值,从而不会出现数据的不一致现象。
? SCD规范到 3NF后, 所存在的异常现象已经全部消失 。
? 但是, 3NF只限制了非主属性对键的依赖关系, 而没有限制主属性对键的
依赖关系 。
? 如果发生了这种依赖, 仍有可能存在数据冗余, 插入异常, 删除异常和
修改异常 。
? 这时, 则需对 3NF进一步规范化, 消除主属性对键的依赖关系, 为了解决
这种问题, Boyce与 Codd共同提出了一个新范式的定义, 这就是 Boyce-
Codd范式, 通常简称 BCNF或 BC范式 。 它弥补了 3NF的不足 。
44
BC范式
4.3.4.1 BC范式的定义
定义 4.7 如果关系模式 R?1NF,且所有的函数依
赖 X→Y ( Y X),决定因素 X都包含了 R的一个
候选键, 则称 R属于 BC范式 ( Boyce-Codd
Normal Form), 记作 R?BCNF。
BCNF具有如下性质:
1,满足 BCNF的关系将消除任何属性 ( 主属性或非主
属性 ) 对键的部分函数依赖和传递函数依赖 。 也就是
说, 如果 R?BCNF,则 R也是 3NF。
证明:采用反证法。设 R不是 3NF。则必然存在如下条
件的函数依赖,X→Y ( Y X),Y→Z,其中 X是键属
性,Y是任意属性组,Z是非主属性,Z Y,这样 Y→Z
函数依赖的决定因素 Y不包含候选键,这与 BCNF范式
的定义相矛盾,所以如果 R?BCNF,则 R也是 3NF。
?
?
45
2,如果 R?3NF,则 R不一定是 BCNF。
? 现举例说明。设关系模式 SNC( SNO,SN,CN0,SCORE),其中
SNO代表学号,SN代表学生姓名并假设没有重名,CNO代表课程号,
SCORE代表成绩。可以判定,SNC有两个候选键( SNO,CNO)和
( SN,CNO),其函数依赖如下:
SNO SN
( SNO,CNO) → SCORE
( SN,CNO) → SCORE。
? 唯一的非主属性 SCORE对键不存在部分函数依赖,也不存在传递
函数依赖。所以 SNC?3NF。
? 但是,因为 SNO SN,即决定因素 SNO或 SN不包含候选键,从另
一个角度说,存在着主属性对键的部分函数依赖:
( SNO,CNO) SN,( SN,CNO) SNO,所以 SNC不是 BCNF。
? 正是存在着这种主属性对键的部分函数依赖关系,造成了关系
SNC中存在着较大的数据冗余,学生姓名的存储次数等于该生所
选的课程数。从而会引起修改异常。
? 比如,当要更改某个学生的姓名时,则必须搜索出现该姓名的每
个学生记录,并对其姓名逐一修改,这样容易造成数据的不一致
问题。
? 解决这一问题的办法仍然是通过投影分解进一步提高 SNC的范式
等级,将 SNC规范到 BCNF。
?
?
? ?? p ? ?? p
46
BCNF规范化
? BCNF规范化是指把 3NF关系模式通过投影分解转换成
BCNF关系模式的集合 。
下面以 3NF关系模式 SNC为例, 来说明 BCNF规范化的过程 。
例 4.3 将 SNC(SNO,SN,CNO,SCORE)规范到 BCNF。
? 分析 SNC数据冗余的原因, 是因为在这一个关系中存在
两个实体, 一个为学生实体, 属性有 SNO,SN;另一个
是选课实体, 属性有 SNO,CNO和 SCORE。
? 根据分解的原则, 我们可以将 SNC分解成如下两个关系:
S1(SNO,SN),描述学生实体;
S2(SNO,CNO,SCORE),描述学生与课程的联系 。
? 对于 S1,有两个候选键 SNO和 SN,
? 对于 S2,主键为( SNO,CNO)。
? 在这两个关系中,无论主属性还是非主属性都不存在
对键的部分依赖和传递依赖,S1?BCNF,S2?BCNF。
47
分解后, S1和 S2的函数依赖分别如图 4.11和 4.12所示 。
SNO SN
SNO
CNO
SCORE
图 4.11 S1中的函数依赖关系 图 4.12 S2中的函数依赖关系
? 关系 SNC转换成 BCNF后,数据冗余度明显降低。
?学生的姓名只在关系 S1中存储一次,学生要改名时,只需改动一条
学生记录中的相应的 SN值,从而不会发生修改异常。
48
例 4.4 设关系模式 TCS( T,C,S), T表示教师, C表示课程, S表
示学生 。 语义假设是, 每一位教师只讲授一门课程;每门课程由
多个教师讲授;某一学生选定某门课程, 就对应于一确定的教师 。
? 根据语义假设, TCS的函数依赖是:
( S,C) → T,( S,T) → C,T→C 。
? 函数依赖图如图 4.13所示。
S
C
T
S
T
C
4.13 TCS中的函数依赖关系
49
?对于 TCS,( S,C) 和 ( S,T) 都是候选键, 两个候选键相交, 有
公共的属性 S。 TCS中不存在非主属性, 也就不可能存在非主属性对
键的部分依赖或传递依赖, 所以 TCS?3NF。
?但从 TCS的一个关系实例 ( 如图 4.14) 分析, 仍存在一些问题 。
T
C
S
T1 C1 S1
T1 C1 S2
T2 C1 S3
T2 C1 S4
T3 C2 S2
T4 C2 S2
T4 C3 S2
图 4.14 关系 TCS
50
1,数据冗余 。 虽然每个教师只开一门课, 但每个选修该
教师该该门课程的学生元组都要记录这一信息 。
2,插入异常 。 当某门课程本学期不开, 自然就没有学生
选修 。 没有学生选修, 因为主属性不能为空, 教师上
该门课程的信息就无法插入 。 同样原因, 学生刚入校,
尚未选课, 有关信息也不能输入 。
3,删除异常 。 如果选修某门课程的学生全部毕业, 删除
学生记录的同时,随之也删除了教师开设该门课程的信
息 。
4,更新异常。 当某个教师开设的某门课程改名后,所有
选修该教师该门课程的学生元组都要进行修改,如果
漏改某个数据,则破坏了数据的完整性。
51
? 分析出现上述问题的原因在于主属性部分依赖于键,
( S,T) C,因此关系模式还继续分解, 转换成更高一
级的范式 BCNF,以消除数据库操作中的异常现象 。
? 将 TCS分解为两个关系模式 ST( S,T) 和 TC( T,C),
消除函数依赖 ( S,T) C。 其中 ST的键为 S,TC的键为 T。
ST?BCNF,TC?BCNF。 这两个关系模式的函数依赖图分
别如图 4.15和 4.16所示 。
S T T C
图 4.15 ST中的函数依赖关系 图 4.16 TC中的函数依赖关系
52
? 关系模式 TCS由规范到 BCNF后, 使原来存在的四个异常问题得到
解决 。
1,数据冗余降低 。 每个教师开设课程的信息只在 TC关系中存储一次 。
2,不存在插入异常 。 对于所开课程尚未有学生选修的教师信息可以直
接存储在关系 TC中, 而对于尚未选修课程的学生可以存储在关系 ST
中 。
3,不存在删除异常 。 如果选修某门课程的学生全部毕业, 可以只删除
关系 ST中的相关学生记录, 而不影响系关系 TC中相应教师开设该门
课程的信息 。
4,不存在更新异常 。 当某个教师开设的某门课程改名后, 只需修改关
系 TC中的一个相应元组即可, 不会破坏数据的完整性 。
? 如果一个关系数据库中所有关系模式都属于 3NF,则已在很大程
度上消除了插入异常和删除异常, 但由于可能存在主属性对候选
键的部分依赖和传递依赖, 因此关系模式的分离仍不够彻底 。
? 如果一个关系数据库中所有关系模式都属于 BCNF,那么在函数依
赖的范畴内, 已经实现了模式的彻底分解, 消除了产生插入异常
和删除异常的根源, 而且数据冗余也减少到极小程度 。
53
4.4 关系模式的规范化
? 到目前为止, 规范化理论已经提出了六类范式 ( 有关 4NF和
5NF的内容不再详细介绍 ) 。
? 各范式级别是在分析函数依赖条件下对关系模式分离程度
的一种测度, 范式级别可以逐级升高 。
? 一个低一级范式的关系模式, 通过模式分解转化为若干个
高一级范式的关系模式的集合, 这种分解过程叫作关系模
式的 规范化 ( Normalization) 。
4.4.1 关系模式规范化的目的和原则
? 一个关系只要其分量都是不可分的数据项,就可称作规范化的关
系,但这只是最基本的规范化。
? 这样的关系模式是合法的。
? 但人们发现有些关系模式存在插入、删除、修改异常、数据冗余
等弊病。
? 规范化的目的就是使结构合理,消除存储异常,使数据冗余尽量
小,便于插入、删除和更新。
54
? 规范化的 基本原则 就是遵从概念单一化, 一事一地, 的原则, 即
一个关系只描述一个实体或者实体间的联系 。
? 若多于一个实体, 就把它, 分离, 出来 。
? 因此, 所谓规范化, 实质上是概念的单一化, 即一个关系表示一
个实体 。
4.4.2 关系模式规范化的步骤
? 规范化就是对原关系进行投影, 消除决定属性不是候
选键的任何函数依赖 。 具体可以分为以下几步:
1,对 1NF关系进行投影, 消除原关系中非主属性对键的部分函数
依赖, 将 1NF关系转换成若干个 2NF关系 。
2,对 2NF关系进行投影, 消除原关系中非主属性对键的传递函数
依赖, 将 2NF关系转换成若干个 3NF关系 。
3,对 3NF关系进行投影, 消除原关系中主属性对键的部分函数依
赖和传递函数依赖, 也就是说使决定因素都包含一个候选键 。
得到一组 BCNF关系 。
55
关系规范化的基本步骤如图 4.17所示。
1NF
2NF
3NF
BCNF
消除决定属性
不是候选键的
非平凡的函数
依赖
消除非主属性对键的部分函数依赖
消除非主属性对键的传递函数依赖
消除主属性对键的部分和传递函数依赖
图 4.17 规范化过程
?一般情况下,我们说没有异常弊病的数据库设计是好的数据库设计,一个不
好的关系模式也总是可以通过分解转换成好的关系模式的集合。
?但是在分解时要全面衡量,综合考虑,视实际情况而定。
?对于那些只要求查询而不要求插入、删除等操作的系统,几种异常现象的存
在并不影响数据库的操作。这时便不宜过度分解,否则当要对整体查询时,
需要更多的多表连接操作,这有可能得不偿失。
?在实际应用中,最有价值的是 3NF和 BCNF,在进行关系模式的设计时,通常
分解到 3NF就足够了。
56
4.4.2 关系模式规范化的要求
? 关系模式的规范化过程是通过对关系模式的投影分解来实现的,
但是投影分解方法不是唯一的, 不同的投影分解会得到不同的结
果 。
? 在这些分解方法中, 只有能够保证分解后的关系模式与原关系模
式等价的方法才是有意义的 。
下面先给出两个定义:
? 无损连接性 ( Lossless Join),设关系模式 R(U,F)被分解为若
干个关系模式 R1(U1,F1),R2(U2,F2),…,Rn(Un,Fn),其中
U=U1U2… UN,且不存在 UNUj式, Fi为 F在 Uj上的投影, 如果 R与 R1,
R2,…, Rn自然连接的结果相等, 则称关系模式 R的分解具有无损
连接性 。
? 函数依赖保持性 ( Preserve Dependency),设关系模式 R(U,F)
被分解为若干个关系模式 R1(U1,F1),R2(U2,F2),…,Rn(Un,
Fn),其中 U=U1U2… UN,且不存在 UNUj式, Fi为 F在 Uj上的投影, 如
果 F所蕴含的函数依赖一定也由分解得到的某个关系模式中的函
数依赖 Fi所蕴含, 则称关系模式 R的分解具有函数依赖保持性 。
57
? 判断对关系模式的一个分解是否与原关系模式等价可以有三种不
同的标准:
1,分解要具有无损连接性 。
2,分解要具有函数依赖保持性 。
3,分解既要具有无损连接性, 又要具有函数依赖保持性 。
例如, 对于 4.3.2.2中例 4.2的关系模式 SD(SNO,SN,AGE,DEPT,MN),
规范到 3NF,可以有以下三种不同的分解方法:
? 第一种:
S(SNO,SN,AGE,DEPT)
D(DEPT,MN)
SD( SNO,SN,AGE,DEPT,MN) =S[SNO,SN,AGE,DEPT]*D[DEPT,MN],
? 也就是说, 用其两个投影在 DEPT上的自然连接可复原关系模式 SD。
也就是说这种分解具有无损连接性 。
? 对于分解后的关系模式 S,有函数依赖 SNO→DEPT, 对于 D,有函
数依赖 DEPT→MN, 这种分解方法保持了原来的 SD中的两个完全函
数依赖 SNO→DEPT, DEPT→MN 。 分解既具有无损连接性, 又具有
函数依赖保持性 。
? 前面已经给出详细的论述,这是一种正确的分解方法。
58
?第二种:
S1(SNO,SN,AGE,DEPT)
D1(SNO,MN)
?分解后的关系如图 4.18所示 。
S1 D1
SNO SN AGE DEPT SNO MN
S1 赵亦 17 计算机 S1 刘伟
S2 钱尔 18 信息 S2 王平
S3 孙珊 20 信息 S3 王平
S4 李思 21 自动化 S4 刘伟
图 4.18 关系 S1和 D1
59
?分解以后, 两个关系的主键都为 SNO,也不存在非
主属性对主键的传递函数依, 所以两个关系均属
于 3NF。
?且 SD=S1*D1,关系模式 SD等于 S1和 D1在 SNO上的自
然连接, 这种分解也具有无损连接性, 保证不丢
失原关系中的信息 。 但这种分解结果, 仍然存在
着一些问题:
1,数据冗余 。 每个系名和系主任的名字存储的次数
等于该系的学生人数 。
2,插入异常 。 当一个新系没有招生时, 系主任的名
字则无法插入 。
3,删除异常 。 某系学生全部毕业而没有招生时, 要
删除全部学生的记录, 两个关系都要涉及, 有关该
系的信息将被删除 。
4,更新异常 。 更换系主任时, 需改动较多的学生记
录 。 另外, 某个学生要转系, 还必须修改两个关系 。
60
?之所以存在上述问题, 是因为分解得到的两个
关系模式不是相互独立的 。
?SD中的函数依赖 DEPT→MN 既没有投影到关系模
式 S1上, 也没有投影到关系模式 D1上, 而是跨
在这两个关系模式上, 也就是说这种分解方法
没有保持原关系中的函数依赖, 却用了原关系
隐含的传递函数依赖 SNO MN。
?分解只具有无损连接性, 而不具有函数依赖保
持性 。
?因此,, 弊病, 仍然没有解决 。
? ?? t
61
? 第三种:
S2(SNO,SN,AGE,MN)
D2(DEPT,MN)
? 分解后的关系如图 4.19所示 。
S2 D2
SNO SN AGE MN DEPT MN
S1 赵亦 17 刘伟 计算机 刘伟
S2 钱尔 18 王平 信息 王平
S3 孙珊 20 王平 自动化 刘伟
S4 李思 21 刘伟
图 4.19 关系 S2和 D2
62
?分解以后, 两个关系均为 3NF,公共属性为 MN,
但 MN SNO,MN DEPT,所以 S2*D2≠SD 。
?S2和 D2在 MN上的自然连接的结果如图 4.20。
SNO SN AGE DEPT MN
S1 赵亦 17 计算机 刘伟
S1 赵亦 17 自动化 刘伟
S2 钱尔 18 信息 王平
S3 孙珊 20 信息 王平
S4 李思 21 计算机 刘伟
S4 李思 21 自动化 刘伟
图 4.20 S2和 D2的自然连接
63
? S2*D2比原来的关系 SD多了两个元组 ( S1,赵亦, 17,
自动化, 刘伟 ) 和 ( S4,李思, 21,计算机, 刘伟 ),
因此也无法知道原来的 SD关系中究竟有哪些元组, 从
这个意义上说, 此分解方法仍然丢失了信息 。 所以其
分解是不可恢复的 。
? 另外, 这种分解方法只保持了原来的 SD中的 DEPT→MN
这个完全函数依赖而未用另外一个 SNO→DEPT 完全依赖,
却用了原关系的传递函数依赖 SNO MN。 所以分解既
不具有无损连接性, 也不具有函数依赖保持性, 同样
存在着数据操作的异常情况 。
? 经以上几种分解方法的分析, 如果一个分解具有无损
连接性, 则能够保证不丢失信息 。 如果一个分解具有
函数依赖保持性, 则可以减轻或解决各种异常情况 。
? 分解具有无损连接性和函数依赖保持性是两个相互独
立的标准 。 具有无损连接性的分解不一定具有函数依
赖保持性 。 同样, 具有函数依赖保持性的分解也不一
定具有无损连接性 。
? ?? t
64
? 规范化理论提供了一套完整的模式分解方法, 按照这
套算法可以做到:如果要求分解既具有无损连接性,
以具有函数依赖保持性, 则分解一定能够达到 3NF,但
不一定能够达到 BCNF。
? 所以在 3NF的规范化中, 既要检查分解是否具有无损连
接性, 又要检查分解是否具有函数依赖保持性 。
? 只有这两条都满足, 才能保证分解的正确性和有效性,
才既不会发生信息丢失, 又保证关系中的数据满足完
整性约束 。
65
小 结
? 在这一章,我们首先由关系模式的存储异常问题引出了函数依赖
的概念,其中包括完全函数依赖、部分函数依赖和传递函数依赖,
这些概念是规范化理论的依据和规范化程度的准则。
? 规范化就是对原关系进行投影,消除决定属性不是候选键的任何
函数依赖。
? 一个关系只要其分量都是不可分的数据项,就可称作规范化的关
系,也称作 1NF。
? 消除 1NF关系中非主属性对键的部分函数依赖,得到 2NF,消除
2NF关系中非主属性对键的传递函数依赖,得到 3NF,消除 3NF
关系中主属性对键的部分函数依赖和传递函数依赖,便可得到一
组 BCNF关系。
? 在规范化过程中,逐渐消除存储异常,使数据冗余尽量小,便于
插入、删除和更新。
? 规范化的基本原则就是遵从概念单一化, 一事一地, 的原则,即
一个关系只描述一个实体或者实体间的联系。
? 规范化的投影分解方法不是唯一的,对于 3NF的规范化,分解既
要具有无损连接性,又要具有函数依赖保持性。