1
第 5章 完整性约束与模式
参考书目:, 数据库系统概论, 萨师煊 王珊,高等教
育出版社
2
本章概要
? 本章讲述完整性约束和关系数据库规范化理论,这是
数据库逻辑设计的理论依据。
? 深刻理解完整性约束的基本概念;
? 要求了解规范化理论的研究动机及其在数据库设计中
的作用;
? 掌握函数依赖的有关概念;
? 理解第一范式、第二范式、第三范式的定义,
? 重点 掌握并能够灵活运用关系模式规范化的方法和关
系模式分解的方法,这也是本章的 难点 。
3
? 为了维护数据库中数据与现实世界的一致性, 对关系
数据库的插入, 删除和修改操作必须有一定的约束条
件, 这就是关系模型的三类完整性:
? 实体完整性
? 参照完整性
? 用户定义的完整性
1,实体完整性 (Entity Integrity)
? 实体完整性 是指主码的值不能为空或部分为空。
? 例如,图 5.4中学生关系中的主码“学号”不能为空;
选课关系中的主码“学号 +课程号”不能部分为空,即
“学号”和“课程号”两个属性都不能为空。
5.1 关系模型的完整性
4
2,参照完整性 (Referential integrity)
? 如果关系 R2的外部关系码 X与关系 R1的主码相符,则 X的
每个值或者等于 R1中主码的某一个值, 或者取空值 。
? 如图 5.1,5.2所示, 学生关系中某个学生 ( 如 s1或 s2)
,系别, 的取值, 必须在参照的系别关系中主码, 系
别, 的值中能够找到, 否则表示把该学生分配到一个
不存在的部门中, 显然不符合语义 。
? 如果某个学生 ( 如 s11), 系别, 取空值, 则表示该学
生尚未分配到任何一个系 。 否则, 它只能取专业关系
中某个元组的专业号值 。
5
S(学生关系) D(系别关系)
图 5.1 S表(学生表) 图 5.2 D表(系别表)
SNO
学号
SN
姓名
SEX
性别
AGE
年龄
DEPT
系别
S1 赵亦 女 17 计算机
S2 钱尔 男 18 信息
? ? ? ? ?
S11 王威 男 19
DEPT
系别
ADDR
地址
计算机 1号楼
信息 1号楼
? ?
自动化 3号楼
6
? 实体完整性 和 参照完整性 是关系模型必须满足的完整
性约束条件, 被称作 关系的两个不变性 。 任何关系数
据库系统都应该支持这两类完整性 。
? 除此之外, 不同的关系数据库系统由于应用环境的不
同, 往往还需要一些特殊的约束条件, 这就是 用户定
义完整性 。
3,用户定义完整性 ( User-defined Integrity)
? 用户定义完整性 是针对某一具体关系数据库的约束条
件 。 它反映某一具体应用所涉及的数据必须满足的语
义要求 。
? 例如, 属性值根据实际需要, 要具备一些约束条件,
如选课关系中成绩不能为负数;某些数据的输入格式
要有一些限制, 关系模型应该提供定义和检验这类完
整性的机制, 以便用统一的, 系统的方法处理它们,
而不要由应用程序承担这一功能 。
7
5.2 规范化问题的提出
5.2.1 规范化理论的主要内容
? 关系数据库的规范化理论主要包括三个方面的内容:
? 函数依赖
? 范式 ( Normal Form)
? 模式设计
? 其中, 函数信赖 起着核心的作用, 是模式分解和模式
设计的基础, 范式是模式分解的标准 。
8
5.1.2 关系模式的存储异常问题
? 数据库的逻辑设计为什么要遵循一定的规范化理论?
? 什么是好的关系模式?
? 某些不好的关系模式可能导致哪些问题?
下面通过例子进行分析,
例如,要求设计 教学管理数据库, 其关系模式 SCD如下:
SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE)
? 其中, SNO表示学生学号, SN表示学生姓名, AGE表示
学生年龄, DEPT表示学生所在的系别, MN表示系主任
姓名, CNO表示课程号, SCORE表示成绩 。
9
根据实际情况, 这些数据有如下语义规定:
① 一个系有若干个学生, 但一个学生只属于一个系;
② 一个系只有一名系主任, 但一个系主任可以同时兼几
个系的系主任;
③ 一个学生可以选修多门功课, 每门课程可有若干学生
选修;
④ 每个学生学习某门课程有一个成绩 。
在此关系模式中填入一部分具体的数据,则可得到 SCD关
系模式的实例,即一个教学管理数据库,如图 5.3所示。
10
图 5.3 关系 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
返回原处
11
? 根据上述的语义规定, 可以看出,(SNO,CNO)属性的组
合能唯一标识一个元组, 所以 (SNO,CNO)是该关系模式
的 主码 。
? 对图 5.3所示的进行数据库的操作时, 会出现以下几方
面的问题:
1,数据冗余 。
每个系名和系主任的名字存储的次数等于该系的学生人数乘以每个学生
选修的课程门数, 同时学生的姓名, 年龄也都要重复存储多次, 数据的
冗余度很大, 浪费了存储空间 。
2,插入异常 。
如果某个新系没有招生, 尚无学生时, 则系名和系主任的信息无法插入
到数据库中 。
? 因为在这个关系模式中, (SNO,CNO)是主码 。 根据关系的实体完整性
约束, 主码的值不能为空, 而这时没有学生, SNO和 CNO均无值, 因
此不能进行插入操作 。
? 另外, 当某个学生尚未选课, 即 CNO未知, 实体完整性约束还规定,
主码的值不能部分为空, 同样不能进行插入操作 。
12
3,删除异常 。
? 某系学生全部毕业且还没有招生时, 删除全部学生的记录
则系名, 系主任也随之删除, 而这个系依然存在, 在数据
库中却无法找到该系的信息 。
? 另外, 如果学生 s4不再选修 C1课程, 本应该只删去 C1,但
C1是主码的一部分, 为保证实体完整性, 必须将整个元组
一起删掉, 这样, 有关该学生的其它信息也随之丢失 。 见
图 5.3所示 。
4,更新异常 。
? 如果学生改名, 则该学生的所有记录都要逐一修改 SN;
? 又如某系更换系主任, 则属于该系的学生记录都要修改 MN
的内容, 稍有不慎, 就有可能漏改某些记录, 这就会造成
数据的不一致性, 破坏了数据的完整性 。
13
? 产生上述问题的原因是因为关系中, 包罗万象,, 内
容太杂 。 所以认为它不是一个好的数据库 。 那么, 怎
样才能得到一个好的关系模式呢?
? 我们把关系模式 SCD分解为下面三个结构简单的关系模
式, 如图 5.4所示:
? 学生关系 S(SNO,SN,AGE,DEPT)
? 选课关系 SC(SNO,CNO,SCORE)
? 系关系 D(DEPT,MN)
14
S SC
图 5.4 分解后的关系模式
SNO SN AGE DEPT
S1 赵亦 17 计算机
S2 钱尔 18 信息
S3 孙珊 20 信息
S4 李思 21 自动化
DEPT MN
计算机 刘伟
信息 王平
自动化 刘伟
D
SNO CNO SCORE
S1 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
返回原处
15
? 在以上三个关系模式中,实现了信息的某种程度的分
离,
? S中存储学生基本信息,与所选课程及系主任无关;当某个学
生尚未选课,只要在关系 S中添加一条学生记录,避免了 插入
异常。
? D中存储系的有关信息,与学生无关;当一个系的学生全部毕
业时,只需在 S中删除该系的全部学生记录,而关系 D中有关
该系的信息仍然保留,从而不会引起 删除异常 。
? SC中存储学生选课的信息,而与所学生及系的有关信息无关。
? 由于数据冗余度的降低,数据没有重复存储,也不会引起 更
新异常 。
16
? 与 SCD相比, 分解为三个关系模式后, 数据的冗余度明
显降低 。 从而得出结论, 一个好的关系模式应该具备
以下四个条件:
1,尽可能少的数据冗余 。
2,没有插入异常 。
3,没有删除异常 。
4,没有更新异常 。
17
? 但是一个好的关系模式并不是在任何情况下都是最优
的,因此要以实际设计的目标出发进行设计,因此,
根据不同的要求将规范化分成若干级别。
? 我们要设计的关系模式中的各属性是相互依赖、相互
制约的,这样才构成了一个结构严谨的整体。因此在
设计关模式时,必须从语义上分析这些 依赖关系 。
? 在此我们先讨论属性间的依赖关系,然后再讨论关系
规范化理论。
18
5.3 函数依赖
5.3.1 函数依赖的定义
?函数依赖 ( Functional Dependency) 是关系模式中
属性之间的一种 逻辑依赖关系 。 下面给函数依赖的形
式化定义:
定义 5.1 设 R( U) 是属性集 U上的关系模式, 令 X和 Y
是 U的子集 。 若 对于 R( U) 的任意一个可能的关系 r及 r
中的任意两个元组 t1和 t2,总满足以下条件:
若 t1[X]= t2[X],则 t1[Y]= t2[Y]
则称 X函数决定 Y,或 Y函数依赖于 X,记作 X→Y 。 我们
称 X为 决定因素, Y为 依赖因素 。
?当 Y不函数依赖于 X时, 记作,X Y。
?当 X→Y 且 Y→X 时, 则记作,X Y。?
19
例 1:教材 P104图 5.2
例 2,对于关系模式 SCD
U={SNO,SN,AGE,DEPT,MN,CNO,SCORE} U为属性集
F={SNO→SN, SNO→AGE, SNO→DEPT} F为函数依赖集
?一个 SNO有多个 SCORE的值与其对应, SNO SCORE。
?但是 SCORE可以被( SNO,CNO)唯一地确定。所以可表
示为:( SNO,CNO) → SCORE。
?重要结论:(教材 P105)函数依赖 不可能从某个具体
的关系实例中推导出来,只能在关系实例中得到验证 。
它是在数据库设计阶段产生,要求在关系模式上产生的
所有关系都必须成立的一种限制性规则。
?问题提出,在设计数据库时除了给定的函数依赖集以外,
还需要考虑在关系模式上成立的其它所有的函数依赖。
那么如何得到所有的函数依赖?
20
5.3.2 函数依赖集的闭包
1,逻辑蕴涵
如果给定 函数依赖集 F,可以证明其他某些函数依赖也
成立, 就称这些函数依赖被 F逻辑蕴含 。
2,闭包
令 F为一个函数依赖集, F的闭包是指被 F逻辑蕴含的所
有函数依赖的集合, 记为 F+。
? 问题提出,如何在给定函数依赖集 F的情况下方便地
推导出它的闭包 F+?
21
5.3.3 函数依赖的公理系统
? Armstrong公理
设有关系模式 R( U), U是 R的属性集, α, β, γ,
δ 都是 U的子集, 推理规则如下:
① 自反律:若 β α, 则 α → β ;
例如, 在关系 SCD中, ( SNO,CNO) → SNO和 ( SNO,
CNO) → CNO。
② 增补律:若 α → β, 则 αγ→ βγ
③ 传递律:若 α → β 及 β → γ, 则 α → γ
例如, 在关系 SCD中, SNO→DEPT 和 DEPT→MN, 则有
SNO→MN 。
? Armstrong公理是正确的完备的 。
?
22
? 推论
① 合并律:若 α → β 及 α → γ, 则 α → βγ
例如, 在关系 SCD中, SNO→ ( SN,AGE), SNO→
( DEPT,MN), 则有 SNO→ ( SN,AGE,DEPT,MN) 。
① 分解律:若 α → βγ,则 α → β 及 α → γ
② 伪传递律:若 α → β 及 γβ→ δ, 则 αγ → δ
23
5.3.4 有关函数依赖的几点说明
1,平凡的函数依赖与非平凡的函数依赖 。
? 当属性集 Y是属性集 X的子集时, 则必然存在着函数
依赖 X→Y,这种类型的函数依赖称为 平凡的函数依
赖 。
? 如果 Y不是 X的子集, 则称 X→Y 为非平凡的函数依赖 。
若不特别声明, 我们讨论的都 是非平凡的函数依赖 。
2,函数依赖是语义范畴的概念 。
? 我们只能根据语义来确定一个函数依赖, 它反映了
一种语义完整性约束 。
例如下列依赖的成立是有一定语义约束的 (? ) 。
SN→AGE SN→DEPT
24
3,函数依赖与属性之间的联系类型有关 。
① 在一个关系模式中, 如果属性 X与 Y有 1:1联系
时, 则存在函数依赖 X→Y, Y→X, 即 X Y
例如, 当学生无重名时, SNO SN。
② 如果属性 X与 Y有 m, 1的联系时, 则只存在函
数依赖 X→Y 。
例如, SNO与 AGE,DEPT之间均为 m, 1联系, 所以有
SNO→AGE, SNO→DEPT 。
③ 如果属性 X与 Y有 m,n的联系时, 则 X与 Y之间
不存在任何函数依赖关系 。
例如, 一个学生可以选修多门课程, 一门课程又可
以为多个学生选修, 所以 SNO与 CNO之间不存在函
数依赖关系 。
?
?
25
4,函数依赖关系的存在与时间无关 。
? 因为函数依赖是指关系中的所有元组应该满足的约
束条件,而不是指关系中某个或某些元组所满足的
约束条件。
? 因此,必须根据语义来确定属性之间的函数依赖,
而不能单凭某一时刻关系中的实际数据值来判断。
例如,对于关系模式 S,假设没有给出无重名的学
生这种语义规定,则即使当前关系中没有重名的记
录,也只能存在函数依赖 SNO→SN, 而 不能 存在函
数依赖 SN→SNO, 因为如果新增加一个重名的学生,
函数依赖 SN→SNO 必然不成立。
26
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。
27
5.3.5 完全函数依赖与部分函数依赖
定义 5.2 设关系模式 R(U),U是属性全集, X和 Y是 U的子
集, 如果 X→Y, 并且对于 X的任何一个真子集 X′,都有
X′ Y,则称 Y对 X完全函数依赖, 记作 X Y。 否则
称为部分函数依赖, 记为 X Y。
例如, 在关系模式 SCD中, 因为 SNO SCORE,且 CNO
SCORE,所以有,( SNO, CNO ) SCORE, 而
SNO→AGE, 所以 ( SNO,CNO) AGE。
? 由定义 5.2可知,只有当决定因素是组合属性时,讨论
部分函数依赖才有意义,当决定因素是单属性时,只
能是完全函数依赖。
? ?? f
? ?? f
? ?? p
? ?? p
28
5.3.6 传递函数依赖
定义 5.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→DEPT, 但 DEPT SNO,
而 DEPT→MN, 则有 SNO MN。 当学生不存在重名的情
况下, 有 SNO→SN, SN→SNO, SNO SN,SN→DEPT,
这时 DEPT对 SNO是 直接函数依赖, 而不是传递函数依
赖 。
??
? ?? t
?
? ?? t
?
29
? 综上所述, 函数依赖分为,
完全函数依赖
部分函数依赖
传递函数依赖
30
5.4 范式
?规范化的基本思想是消除关系模式中的数据冗余,
消除数据依赖中的不合适的部分,解决数据插入、删
除时发生异常现象。
?为不同程度的规范化要求而设立的不同标准称为 范
式 ( Normal Form)。由于规范化的程度不同,就产生
了 不同的范式 。
?至此在关系数据库规范中建立了一个范式系列:
1NF,2NF,3NF,BCNF,4NF,5NF,一级比一级有更严格的要
求。各个范式之间的联系可以表示为:
5NF 4NF BCNF 3NF 2NF 1NF,如图 5.5所示。? ? ? ? ?
31
图 5.5 各种范式之间的关系
32
5.4.1 第一范式 ( First Normal Form)
定义 5.4 如果关系模式 R,每个属性都是不可再分的原
子属性, 则称 R属于第一范式, 简称 1NF,记作 R?1NF。
?在关系数据库系统中只讨论规范化的关系,凡是非规
范化的关系模式必须化成规范化的关系。
?每个规范化的关系都属于 1NF,这也是它之所以称为
“第一”的原因。
33
然而, 一个关系模式仅仅属于第一范式是不适用
的 。 例如在 5.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
34
我们可以用函数依赖图表示以上函数依赖关系,如图 5.6所示。
SN
MN
SCORE
图 5.6 SCD中的函数依赖关系
SNO
CNO
P
P
f
?由此可见,在 SCD中,既存在完全函数依赖,又存在部
分函数依赖和传递函数依赖,如此复杂的函数依赖,导
致了数据操作中出现的种种弊端。因此必须用投影运算
将关系分解,去掉过于复杂的函数依赖关系,向更高一
级的范式进行转换。
35
5.4.2 第二范式
5.4.2.1 第二范式的定义
定义 5.5 如果关系模式 R?1NF,且每个非主属性都完全
函数依赖于 R的每个关系码, 则称 R属于 第二范式,简称
2NF,记作 R?2NF。
?在关系模式 SCD中,SNO,CNO为主属性,AGE,DEPT,
MN,MN,SCORE均为非主属性,经上述分析,存在非主属
性对关系码的部分函数依赖,所以 SCD 2NF。
?而如图 5.4所示的由 SCD分解的三个关系模式 S,D,SC,
其中 S的关系码为 SNO,D的关系码为 DEPT,都是单属性,
不可能存在部分函数依赖。
?而对于 SC,( SNO,CNO) SCORE。所以 SCD分解后,
消除了非主属性对关系码的部分函数依赖,S,D,SC均
属于 2NF。
? ?? f
?
36
? 经以上分析, 可以得到两个结论:
① 从 1NF关系中消除非主属性对关系码的部分函数依赖,
则可得到 2NF关系 。
② 如果 R的关系码为单属性, 或 R的全体属性均为主属性,
则 R?2NF。
37
5.4.2.2 2NF规范化
?2NF规范化是指把 1NF关系 模式通过投影分解转换成 2NF关
系模式的集合 。 分解时遵循的基本原则就是, 一事一地,,
让一个关系只描述一个实体或者实体间的联系 。 如果多于
一个实体或联系, 则进行投影分解 。
?下面以关系模式 SCD为例, 来说明 2NF规范化的过程
例 5.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分解成如下两个关
系,如图 5.7所示。
? ?? f
38
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 图 5.7 关系 SD和 SC
返回 P64
39
? SD?2NF,SC?2NF,而且前面已经讨论,SCD的这种分
解没有丢失任何信息,具有无损连接性。
? 分解后,SD和 SC的函数依赖分别如图 5.8和 5.9所示。
SNO
SN SNO
CNO
SCOREAGE
DEPT
MN
图 5.8 SD中的函数依赖关系 图 5.9 SC中的函数依赖关系
返回 P64
40
下面对 2NF规范化作形式化的描述:
? 设关系模式 R( X,Y,Z), R?1NF,但 R 2NF,其中,
X是 主码 属性, Y,Z是 非码属性, 且存在部分函数依赖,
X Y。 设 X可表示为 X1X2,其中 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 ?
41
5.4.2.3 2NF的缺点
?2NF的关系模式解决了 1NF中存在的一些问题, 但 2NF的
关系模式在进行数据操作时, 仍然存在着一些问题:
?数据冗余 。 每个系名和系主任的名字存储的次数等于该
系的学生人数 。
?插入异常 。 当一个新系没有招生时, 有关该系的信息无
法插入 。
?删除异常 。 某系学生全部毕业而没有招生时, 删除全部
学生的记录也随之删除了该系的有关信息 。
?更新异常 。 更换系主任时, 仍需改动较多的学生记录 。
42
?分析 SD中的函数依赖关系,
SNO→SN, SNO→AGE, SNO→DEPT, DEPT→MN,
SNO MN,非主属性 MN对主码 SNO传递依赖。
?存在上述问题,就是由于在 SCD中存在着非主属性对
主码的传递依赖。
?为此,对关系模式 SD还需进一步简化,消除这种传
递依赖,得到 3NF。
? ?? t
43
5.4.3 第三范式
5.4.3.1 第三范式的定义
定义 5.6 如果关系模式 R?2NF,且每个非主属性都不传
递依赖于 R的每个关系码, 则称 R属于第三范式,简称 3NF,
记作 R?3NF。
5.4.3.2 3NF规范化
?3NF规范化 是指把 2NF关系模式通过投影分解转换成 3NF
关系模式的集合 。
?和 2NF的规范化时遵循的原则相同, 即, 一事一地,,
让一个关系只描述一个实体或者实体间的联系 。
44
下面以 2NF关系模式 SD为例, 来说明 3NF规范化的过程 。
例 5.2 将 SD(SNO,SN,AGE,DEPT,MN)规范到 3NF。
? 分析 SD的属性组成, 可以判断, 关系 SD实际上描
述了两个实体:
? 一个为学生实体, 属性有 SNO,SN,AGE,DEPT;
? 另一个是系的实体, 其属性 DEPT和 MN。
? 根据分解的原则, 我们可以将 SD分解成如下两个关
系, 如图 5.10所示 。
S(SNO,SN,AGE,DEPT),描述学生实体;
D(DEPT,MN),描述系的实体。
45
S D
SNO SN AGE DEPT DEPT MN
S1 赵亦 17 计算机 计算机 刘伟
S2 钱尔 18 信息 信息 王平
S3 孙珊 20 信息 自动化 刘伟
S4 李思 21 自动化
对于分解后的两个关系 S和 D,主码分别为 SNO和 DEPT,
不存在非主属性对主码的传递函数依赖 。 因此, S?3NF,
D?3NF。
图 5.10 关系 S和 D
46
? 分解后, S和 D的函数依赖分别如图 5.10和 5.11所示 。
SNO
SN
DEPTAGE
DEPT
MN
图 5.10 S中的函数依赖关系图 图 5.11 D中的函数依赖关系图
由以上两图可以看出, 关系模式 SD由 2NF分解为 3NF后,
函数依赖关系变得更加简单, 既没有非主属性对码的部
分依赖, 也没有非主属性对码的传递依赖, 解决了 2NF
中存在的四个问题:
47
? 数据冗余降低 。 系主任的名字存储的次数与该系的学
生人数无关, 只在关系 D中存储一次 。
? 不存在插入异常 。 当一个新系没有学生时, 该系的信
息可以直接插入到关系 D中, 而与学生关系 S无关 。
? 不存在删除异常 。 要删除某系的全部学生而仍然保留
该系的有关信息时, 可以只删除学生关系 S中的相关学
生记录, 而不影响系关系 D中的数据 。
? 不存在更新异常 。 更换系主任时, 只需修改关系 D中一
个相应元组的 MN属性值, 从而不会出现数据的不一致
现象 。
48
3NF的不足:
? 3NF只限制了非主属性对码的依赖关系, 而没有限制主
属性对码的依赖关系 。 如果发生了这种依赖, 仍有可
能存在数据冗余, 插入异常, 删除异常和修改异常 。
这时, 则需对 3NF进一步规范化, 消除主属性对码的依
赖关系
? Boyce与 Codd共同提出了一个新范式的定义, 这就是
Boyce-Codd范式, 通常简称 BCNF或 BC范式 。 它弥补了
3NF的不足 。
49
5.3.4 BC范式
5.3.4.1 BC范式的定义
定义 5.7 如果关系模式 R?1NF,且所有的函数依赖 X→Y
( Y X),决定因素 X都包含了 R的一个候选码, 则称 R
属于 BC范式 ( Boyce-Codd Normal Form ), 记作
R?BCNF。
5.3.4.2 BCNF规范化
?BCNF规范化是指把 3NF关系模式通过投影分解转换成
BCNF关系模式的集合 。
?下面以 3NF关系模式 SNC为例, 来说明 BCNF规范化的过
程 。
?
50
例 5.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。
51
分解后, S1和 S2的函数依赖分别如图 5.12和 5.13所示 。
SNO SN
SNO
CNO
SCORE
图 5.12 S1中的函数依赖关系 图 5.13 S2中的函数依赖关系
? 关系 SNC转换成 BCNF后,数据冗余度明显降低。
?学生的姓名只在关系 S1中存储一次,学生要改名时,只
需改动一条学生记录中的相应的 SN值,从而不会发生修改
异常 。
52
例 5.4 设关系模式 TCS( T,C,S), T表示教师, C表示
课程, S表示学生 。 语义假设是, 每一位教师只讲授一
门课程;每门课程由多个教师讲授;某一学生选定某
门课程, 就对应于一确定的教师 。
? 根据语义假设, TCS的函数依赖是:
( S,C) → T,( S,T) → C,T→C 。
? 函数依赖图如图 5.14所示。
S
C
T
S
T
C
5.14 TCS中的函数依赖关系
53
?对于 TCS,( S,C) 和 ( S,T) 都是候选码, 两个候选
码相交, 有公共的属性 S。 TCS中不存在非主属性, 也就
不可能存在非主属性对码的部分依赖或传递依赖, 所以
TCS?3NF。
?但从 TCS的一个关系实例 ( 如图 5.15) 分析, 仍存在一
些问题 。
T
C
S
T1 C1 S1
T1 C1 S2
T2 C1 S3
T2 C1 S4
T3 C2 S2
T4 C2 S2
T4 C3 S2
图 5.15 关系 TCS
54
? 数据冗余 。 虽然每个教师只开一门课, 但每个选修该
教师的该门课程的学生元组都要记录这一信息 。
? 插入异常 。 当某门课程本学期不开, 自然就没有学生
选修 。 没有学生选修, 因为主属性不能为空, 教师上
该门课程的信息就无法插入 。 同样原因, 学生刚入校,
尚未选课, 有关信息也不能输入 。
? 删除异常 。 如果选修某门课程的学生全部毕业, 删除
学生记录的同时,随之也删除了教师开设该门课程的信
息 。
? 更新异常 。 当某个教师开设的某门课程改名后, 所有
选修该教师该门课程的学生元组都要进行修改, 如果
漏改某个数据, 则破坏了数据的完整性 。
55
?分析出现上述问题的原因在于主属性部分依赖于码,
( S,T) C,因此关系模式还继续分解, 转换成更高一
级的范式 BCNF,以消除数据库操作中的异常现象 。
?将 TCS分解为两个关系模式 ST( S,T) 和 TC( T,C),
消除函数依赖 ( S,T) C。 其中 ST的码为 S,TC的码为 T。
ST?BCNF,TC?BCNF。 这两个关系模式的函数依赖图分别
如图 5.16和 5.17所示 。
S T T C
图 5.16 ST中的函数依赖关系 图 5.17 TC中的函数依赖关系
? ?? p
? ?? p
56
关系模式 TCS由规范到 BCNF后, 使原来存在的四个异常问
题得到解决:
? 数据冗余降低 。 每个教师开设课程的信息只在 TC关系
中存储一次 。
? 不存在插入异常 。 对于所开课程尚未有学生选修的教
师信息可以直接存储在关系 TC中, 而对于尚未选修课
程的学生可以存储在关系 ST中 。
? 不存在删除异常 。 如果选修某门课程的学生全部毕业,
可以只删除关系 ST中的相关学生记录, 而不影响系关
系 TC中相应教师开设该门课程的信息 。
? 不存在更新异常 。 当某个教师开设的某门课程改名后,
只需修改关系 TC中的一个相应元组即可, 不会破坏数
据的完整性 。
57
? 如果一个关系数据库中所有关系模式都属于 3NF,则已
在很大程度上消除了插入异常和删除异常, 但由于可
能存在主属性对候选码的部分依赖和传递依赖, 因此
关系模式的分离仍不够彻底 。
? 如果一个关系数据库中所有关系模式都属于 BCNF,那
么在函数依赖的范畴内, 已经实现了模式的彻底分解,
消除了产生插入异常和删除异常的根源, 而且数据冗
余也减少到极小程度 。
58
5.5 关系模式的规范化
— 模式分解
5.5.1 问题的提出
例,教材 P108,有关系模式:
Course_teacher_schema(course_name,course_location
,course_capacity,teacher_number,teacher_name,te
acher_age,department_name)
被分解成如下两个模式:
? Course_deparetment_schema(course_name,course_lo
cation,course_capacity,department_name)
? Teacher_department_schema(teacher_number,teache
r_name,teacher_age,department_name)
分解之后进行查询时将出现意外情况, 称这样的分解为
有损分解 。
59
5.5.2 无损连接分解
设 R为关系模式,关系模式集 {R1,R2, ?, Rn}为 R
的一个分解,即,R=R1∪R 2 ∪? ∪R n。令 r是模式 R上的
关系,即 r( R),而 ri= Π Ri(r),于总有:
r? r1 ∞ r2 ∞? ∞ rn
令 C为数据库上的约束集合。如果对于模式 R上满足的所有
合法关系 r,均有:
r= Π R1(r) ∞ Π R2(r) ∞ ? Π Rn(r)
那么,{R1,R2, ?, Rn}就是关于 R的 无损连接分解 。
60
5.5.3 规范化 ( Normalization)
? 一个低一级范式的关系模式, 通过模式分解转化为若
干个高一级范式的关系模式的集合, 这种分解过程叫
作关系模式的 规范化 。
5.5.3.1 关系模式规范化的目标
① 是一个无损连接分解;
② 保持所有的函数依赖;
③ 分解后的模式最好是 BCNF或是 3NF
61
5.5.3,2 无损连接分解的充要条件
定理,设 R<U,F>的一个分解 ={R1<U1,F1>,R1<U2,F2>}
具有无损连接分解的条件是,U1∩ U2→ U1﹣ U2∈F +或
U1∩ U2→ U2﹣ U1∈F +。
?
62
5.5.3.3 关系模式规范化的步骤
? 规范化就是对原关系进行投影, 消除决定属性不是候
选码的任何函数依赖 。 具体可以分为以下几步:
① 对 1NF关系进行投影, 消除原关系中非主属性对码
的部分函数依赖, 将 1NF关系转换成若干个 2NF关
系 。
② 对 2NF关系进行投影, 消除原关系中非主属性对码
的传递函数依赖, 将 2NF关系转换成若干个 3NF关
系 。
③ 对 3NF关系进行投影, 消除原关系中主属性对码的
部分函数依赖和传递函数依赖, 也就是说使决定
因素都包含一个候选码 。 得到一组 BCNF关系 。
63
关系规范化的基本步骤如图 5.18所示。
1NF
2NF
3NF
BCNF
消除决定属性
不是候选码的
非平凡的函数
依赖
消除非主属性对码的部分函数依赖
消除非主属性对码的传递函数依赖
消除主属性对码的部分和传递函数依赖
图 5.18 规范化过程
?一个不好的关系模式分解转换成好的关系模式的集合时要全面衡量,
综合考虑,视实际情况而定。
?对于那些只要求查询而不要求插入、删除等操作的系统,几种异常
现象的存在并不影响数据库的操作。这时便不宜过度分解,否则当要
对整体查询时,需要更多的多表连接操作,这有可能得不偿失。
?在实际应用中,最有价值的是 3NF和 BCNF,在进行关系模式的设计
时,通常分解到 3NF就足够了。
64
5.5.3.4 模式分解实例
[实例 ] 对于 讲义 P38图 5.7表 SD中的关系模式
SD(SNO,SN,AGE,DEPT,MN),
其函数依赖 见 P39图 5.8。
要求规范到 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 。 分
解既具有无损连接性, 又具有函数依赖保持性 。
? 这是一种正确的分解方法。
65
? 第二种:
S1(SNO,SN,AGE,DEPT)
D1(SNO,MN)
? 分解后的关系如图 5.18所示 。
S1 D1
SNO SN AGE DEPT SNO MN
S1 赵亦 17 计算机 S1 刘伟
S2 钱尔 18 信息 S2 王平
S3 孙珊 20 信息 S3 王平
S4 李思 21 自动化 S4 刘伟
图 5.18 关系 S1和 D1
66
? 分解以后, 两个关系的主码都为 SNO,也不存在非主属性对
主码的传递函数依, 所以两个关系均属于 3NF。
? 且 SD=S1*D1,关系模式 SD等于 S1和 D1在 SNO上的自然连接,
这种分解也具有无损连接性, 保证不丢失原关系中的信息 。
但这种分解结果, 仍然存在着一些问题:
1,数据冗余 。 每个系名和系主任的名字存储的次数
等于该系的学生人数 。
2,插入异常 。 当一个新系没有招生时, 系主任的名
字则无法插入 。
3,删除异常 。 某系学生全部毕业而没有招生时, 要
删除全部学生的记录, 两个关系都要涉及, 有关该
系的信息将被删除 。
4,更新异常 。 更换系主任时, 需改动较多的学生记
录 。 另外, 某个学生要转系, 还必须修改两个关系 。
67
? 之所以存在上述问题, 是因为分解得到的两个关系模
式不是相互独立的 。
? SD中的函数依赖 DEPT→MN 既没有投影到关系模式 S1上,
也没有投影到关系模式 D1上, 而是跨在这两个关系模
式上, 也就是说这种分解方法 没有保持原关系中的函
数依赖, 却用了原关系隐含的传递函数依赖
SNO MN。
? 分解只具有无损连接性, 而 不具有函数依赖保持性 。
因此,, 弊病, 仍然没有解决 。
? ?? t
68
? 第三种:
S2(SNO,SN,AGE,MN)
D2(DEPT,MN)
? 分解后的关系如图 5.19所示 。
S2 D2
SNO SN AGE MN DEPT MN
S1 赵亦 17 刘伟 计算机 刘伟
S2 钱尔 18 王平 信息 王平
S3 孙珊 20 王平 自动化 刘伟
S4 李思 21 刘伟
图 5.19 关系 S2和 D2
69
? 分解以后, 两个关系均为 3NF,公共属性为 MN,
但 MN SNO,MN DEPT,所以 S2*D2≠SD 。
? S2和 D2在 MN上的自然连接的结果如图 5.20。
SNO SN AGE DEPT MN
S1 赵亦 17 计算机 刘伟
S1 赵亦 17 自动化 刘伟
S2 钱尔 18 信息 王平
S3 孙珊 20 信息 王平
S4 李思 21 计算机 刘伟
S4 李思 21 自动化 刘伟
图 5.20 S2和 D2的自然连接
70
? S2*D2比原来的关系 SD多了两个元组 ( S1,赵亦, 17,
自动化, 刘伟 ) 和 ( S4,李思, 21,计算机, 刘伟 ),
因此也无法知道原来的 SD关系中究竟有哪些元组, 从
这个意义上说, 此分解方法仍然丢失了信息 。 所以其
分解是不可恢复的 。
? 另外, 这种分解方法只保持了原来的 SD中的 DEPT→MN
这个完全函数依赖而未用另外一个 SNO→DEPT 完全依赖,
却用了原关系的传递函数依赖 SNO MN。 所以分解既
不具有无损连接性, 也 不具有函数依赖保持性, 同样
存在着数据操作的异常情况 。
? ?? t
71
几点说明:
? 经以上几种分解方法的分析, 如果一个分解具有无损
连接性, 则能够保证不丢失信息 。 如果一个分解具有
函数依赖保持性, 则可以减轻或解决各种异常情况 。
? 分解具有无损连接性和函数依赖保持性是两个相互独
立的标准 。 具有无损连接性的分解不一定具有函数依
赖保持性 。 同样, 具有函数依赖保持性的分解也不一
定具有无损连接性 。
? 规范化理论提供了一套完整的模式分解算法 ( 见萨师
煊, 王珊 数据库系统概论 ), 按照这套算法可以做
到:如果要求分解既具有无损连接性, 也具有函数依
赖保持性, 且分解一定能够达到 3NF。
72
? 所以在 3NF的规范化中, 既要检查分解是否具有无损连
接性, 又要检查分解是否具有函数依赖保持性 。 只有
这两条都满足, 才能保证分解的正确性和有效性, 既
保证不会发生信息丢失, 又保证关系中的数据满足完
整性约束 。
73
小 结
? 在这一章,我们首先由关系模式的存储异常问题引出了函数依赖
的概念,其中包括完全函数依赖、部分函数依赖和传递函数依赖,
这些概念是规范化理论的依据和规范化程度的准则。
? 规范化就是对原关系进行投影,消除决定属性不是候选码的任何
函数依赖。
? 一个关系只要其分量都是不可分的数据项,就可称作规范化的关
系,也称作 1NF。
? 消除 1NF关系中非主属性对码的部分函数依赖,得到 2NF,消除
2NF关系中非主属性对码的传递函数依赖,得到 3NF,消除 3NF关
系中主属性对码的部分函数依赖和传递函数依赖,便可得到一组
BCNF关系。
? 在规范化过程中,逐渐消除存储异常,使数据冗余尽量小,便于
插入、删除和更新。
? 规范化的基本原则就是遵从概念单一化“一事一地”的原则,即
一个关系只描述一个实体或者实体间的联系。
? 规范化的投影分解方法不是唯一的,对于 3NF的规范化,分解既
要具有无损连接性,又要具有函数依赖保持性。
第 5章 完整性约束与模式
参考书目:, 数据库系统概论, 萨师煊 王珊,高等教
育出版社
2
本章概要
? 本章讲述完整性约束和关系数据库规范化理论,这是
数据库逻辑设计的理论依据。
? 深刻理解完整性约束的基本概念;
? 要求了解规范化理论的研究动机及其在数据库设计中
的作用;
? 掌握函数依赖的有关概念;
? 理解第一范式、第二范式、第三范式的定义,
? 重点 掌握并能够灵活运用关系模式规范化的方法和关
系模式分解的方法,这也是本章的 难点 。
3
? 为了维护数据库中数据与现实世界的一致性, 对关系
数据库的插入, 删除和修改操作必须有一定的约束条
件, 这就是关系模型的三类完整性:
? 实体完整性
? 参照完整性
? 用户定义的完整性
1,实体完整性 (Entity Integrity)
? 实体完整性 是指主码的值不能为空或部分为空。
? 例如,图 5.4中学生关系中的主码“学号”不能为空;
选课关系中的主码“学号 +课程号”不能部分为空,即
“学号”和“课程号”两个属性都不能为空。
5.1 关系模型的完整性
4
2,参照完整性 (Referential integrity)
? 如果关系 R2的外部关系码 X与关系 R1的主码相符,则 X的
每个值或者等于 R1中主码的某一个值, 或者取空值 。
? 如图 5.1,5.2所示, 学生关系中某个学生 ( 如 s1或 s2)
,系别, 的取值, 必须在参照的系别关系中主码, 系
别, 的值中能够找到, 否则表示把该学生分配到一个
不存在的部门中, 显然不符合语义 。
? 如果某个学生 ( 如 s11), 系别, 取空值, 则表示该学
生尚未分配到任何一个系 。 否则, 它只能取专业关系
中某个元组的专业号值 。
5
S(学生关系) D(系别关系)
图 5.1 S表(学生表) 图 5.2 D表(系别表)
SNO
学号
SN
姓名
SEX
性别
AGE
年龄
DEPT
系别
S1 赵亦 女 17 计算机
S2 钱尔 男 18 信息
? ? ? ? ?
S11 王威 男 19
DEPT
系别
ADDR
地址
计算机 1号楼
信息 1号楼
? ?
自动化 3号楼
6
? 实体完整性 和 参照完整性 是关系模型必须满足的完整
性约束条件, 被称作 关系的两个不变性 。 任何关系数
据库系统都应该支持这两类完整性 。
? 除此之外, 不同的关系数据库系统由于应用环境的不
同, 往往还需要一些特殊的约束条件, 这就是 用户定
义完整性 。
3,用户定义完整性 ( User-defined Integrity)
? 用户定义完整性 是针对某一具体关系数据库的约束条
件 。 它反映某一具体应用所涉及的数据必须满足的语
义要求 。
? 例如, 属性值根据实际需要, 要具备一些约束条件,
如选课关系中成绩不能为负数;某些数据的输入格式
要有一些限制, 关系模型应该提供定义和检验这类完
整性的机制, 以便用统一的, 系统的方法处理它们,
而不要由应用程序承担这一功能 。
7
5.2 规范化问题的提出
5.2.1 规范化理论的主要内容
? 关系数据库的规范化理论主要包括三个方面的内容:
? 函数依赖
? 范式 ( Normal Form)
? 模式设计
? 其中, 函数信赖 起着核心的作用, 是模式分解和模式
设计的基础, 范式是模式分解的标准 。
8
5.1.2 关系模式的存储异常问题
? 数据库的逻辑设计为什么要遵循一定的规范化理论?
? 什么是好的关系模式?
? 某些不好的关系模式可能导致哪些问题?
下面通过例子进行分析,
例如,要求设计 教学管理数据库, 其关系模式 SCD如下:
SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE)
? 其中, SNO表示学生学号, SN表示学生姓名, AGE表示
学生年龄, DEPT表示学生所在的系别, MN表示系主任
姓名, CNO表示课程号, SCORE表示成绩 。
9
根据实际情况, 这些数据有如下语义规定:
① 一个系有若干个学生, 但一个学生只属于一个系;
② 一个系只有一名系主任, 但一个系主任可以同时兼几
个系的系主任;
③ 一个学生可以选修多门功课, 每门课程可有若干学生
选修;
④ 每个学生学习某门课程有一个成绩 。
在此关系模式中填入一部分具体的数据,则可得到 SCD关
系模式的实例,即一个教学管理数据库,如图 5.3所示。
10
图 5.3 关系 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
返回原处
11
? 根据上述的语义规定, 可以看出,(SNO,CNO)属性的组
合能唯一标识一个元组, 所以 (SNO,CNO)是该关系模式
的 主码 。
? 对图 5.3所示的进行数据库的操作时, 会出现以下几方
面的问题:
1,数据冗余 。
每个系名和系主任的名字存储的次数等于该系的学生人数乘以每个学生
选修的课程门数, 同时学生的姓名, 年龄也都要重复存储多次, 数据的
冗余度很大, 浪费了存储空间 。
2,插入异常 。
如果某个新系没有招生, 尚无学生时, 则系名和系主任的信息无法插入
到数据库中 。
? 因为在这个关系模式中, (SNO,CNO)是主码 。 根据关系的实体完整性
约束, 主码的值不能为空, 而这时没有学生, SNO和 CNO均无值, 因
此不能进行插入操作 。
? 另外, 当某个学生尚未选课, 即 CNO未知, 实体完整性约束还规定,
主码的值不能部分为空, 同样不能进行插入操作 。
12
3,删除异常 。
? 某系学生全部毕业且还没有招生时, 删除全部学生的记录
则系名, 系主任也随之删除, 而这个系依然存在, 在数据
库中却无法找到该系的信息 。
? 另外, 如果学生 s4不再选修 C1课程, 本应该只删去 C1,但
C1是主码的一部分, 为保证实体完整性, 必须将整个元组
一起删掉, 这样, 有关该学生的其它信息也随之丢失 。 见
图 5.3所示 。
4,更新异常 。
? 如果学生改名, 则该学生的所有记录都要逐一修改 SN;
? 又如某系更换系主任, 则属于该系的学生记录都要修改 MN
的内容, 稍有不慎, 就有可能漏改某些记录, 这就会造成
数据的不一致性, 破坏了数据的完整性 。
13
? 产生上述问题的原因是因为关系中, 包罗万象,, 内
容太杂 。 所以认为它不是一个好的数据库 。 那么, 怎
样才能得到一个好的关系模式呢?
? 我们把关系模式 SCD分解为下面三个结构简单的关系模
式, 如图 5.4所示:
? 学生关系 S(SNO,SN,AGE,DEPT)
? 选课关系 SC(SNO,CNO,SCORE)
? 系关系 D(DEPT,MN)
14
S SC
图 5.4 分解后的关系模式
SNO SN AGE DEPT
S1 赵亦 17 计算机
S2 钱尔 18 信息
S3 孙珊 20 信息
S4 李思 21 自动化
DEPT MN
计算机 刘伟
信息 王平
自动化 刘伟
D
SNO CNO SCORE
S1 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
返回原处
15
? 在以上三个关系模式中,实现了信息的某种程度的分
离,
? S中存储学生基本信息,与所选课程及系主任无关;当某个学
生尚未选课,只要在关系 S中添加一条学生记录,避免了 插入
异常。
? D中存储系的有关信息,与学生无关;当一个系的学生全部毕
业时,只需在 S中删除该系的全部学生记录,而关系 D中有关
该系的信息仍然保留,从而不会引起 删除异常 。
? SC中存储学生选课的信息,而与所学生及系的有关信息无关。
? 由于数据冗余度的降低,数据没有重复存储,也不会引起 更
新异常 。
16
? 与 SCD相比, 分解为三个关系模式后, 数据的冗余度明
显降低 。 从而得出结论, 一个好的关系模式应该具备
以下四个条件:
1,尽可能少的数据冗余 。
2,没有插入异常 。
3,没有删除异常 。
4,没有更新异常 。
17
? 但是一个好的关系模式并不是在任何情况下都是最优
的,因此要以实际设计的目标出发进行设计,因此,
根据不同的要求将规范化分成若干级别。
? 我们要设计的关系模式中的各属性是相互依赖、相互
制约的,这样才构成了一个结构严谨的整体。因此在
设计关模式时,必须从语义上分析这些 依赖关系 。
? 在此我们先讨论属性间的依赖关系,然后再讨论关系
规范化理论。
18
5.3 函数依赖
5.3.1 函数依赖的定义
?函数依赖 ( Functional Dependency) 是关系模式中
属性之间的一种 逻辑依赖关系 。 下面给函数依赖的形
式化定义:
定义 5.1 设 R( U) 是属性集 U上的关系模式, 令 X和 Y
是 U的子集 。 若 对于 R( U) 的任意一个可能的关系 r及 r
中的任意两个元组 t1和 t2,总满足以下条件:
若 t1[X]= t2[X],则 t1[Y]= t2[Y]
则称 X函数决定 Y,或 Y函数依赖于 X,记作 X→Y 。 我们
称 X为 决定因素, Y为 依赖因素 。
?当 Y不函数依赖于 X时, 记作,X Y。
?当 X→Y 且 Y→X 时, 则记作,X Y。?
19
例 1:教材 P104图 5.2
例 2,对于关系模式 SCD
U={SNO,SN,AGE,DEPT,MN,CNO,SCORE} U为属性集
F={SNO→SN, SNO→AGE, SNO→DEPT} F为函数依赖集
?一个 SNO有多个 SCORE的值与其对应, SNO SCORE。
?但是 SCORE可以被( SNO,CNO)唯一地确定。所以可表
示为:( SNO,CNO) → SCORE。
?重要结论:(教材 P105)函数依赖 不可能从某个具体
的关系实例中推导出来,只能在关系实例中得到验证 。
它是在数据库设计阶段产生,要求在关系模式上产生的
所有关系都必须成立的一种限制性规则。
?问题提出,在设计数据库时除了给定的函数依赖集以外,
还需要考虑在关系模式上成立的其它所有的函数依赖。
那么如何得到所有的函数依赖?
20
5.3.2 函数依赖集的闭包
1,逻辑蕴涵
如果给定 函数依赖集 F,可以证明其他某些函数依赖也
成立, 就称这些函数依赖被 F逻辑蕴含 。
2,闭包
令 F为一个函数依赖集, F的闭包是指被 F逻辑蕴含的所
有函数依赖的集合, 记为 F+。
? 问题提出,如何在给定函数依赖集 F的情况下方便地
推导出它的闭包 F+?
21
5.3.3 函数依赖的公理系统
? Armstrong公理
设有关系模式 R( U), U是 R的属性集, α, β, γ,
δ 都是 U的子集, 推理规则如下:
① 自反律:若 β α, 则 α → β ;
例如, 在关系 SCD中, ( SNO,CNO) → SNO和 ( SNO,
CNO) → CNO。
② 增补律:若 α → β, 则 αγ→ βγ
③ 传递律:若 α → β 及 β → γ, 则 α → γ
例如, 在关系 SCD中, SNO→DEPT 和 DEPT→MN, 则有
SNO→MN 。
? Armstrong公理是正确的完备的 。
?
22
? 推论
① 合并律:若 α → β 及 α → γ, 则 α → βγ
例如, 在关系 SCD中, SNO→ ( SN,AGE), SNO→
( DEPT,MN), 则有 SNO→ ( SN,AGE,DEPT,MN) 。
① 分解律:若 α → βγ,则 α → β 及 α → γ
② 伪传递律:若 α → β 及 γβ→ δ, 则 αγ → δ
23
5.3.4 有关函数依赖的几点说明
1,平凡的函数依赖与非平凡的函数依赖 。
? 当属性集 Y是属性集 X的子集时, 则必然存在着函数
依赖 X→Y,这种类型的函数依赖称为 平凡的函数依
赖 。
? 如果 Y不是 X的子集, 则称 X→Y 为非平凡的函数依赖 。
若不特别声明, 我们讨论的都 是非平凡的函数依赖 。
2,函数依赖是语义范畴的概念 。
? 我们只能根据语义来确定一个函数依赖, 它反映了
一种语义完整性约束 。
例如下列依赖的成立是有一定语义约束的 (? ) 。
SN→AGE SN→DEPT
24
3,函数依赖与属性之间的联系类型有关 。
① 在一个关系模式中, 如果属性 X与 Y有 1:1联系
时, 则存在函数依赖 X→Y, Y→X, 即 X Y
例如, 当学生无重名时, SNO SN。
② 如果属性 X与 Y有 m, 1的联系时, 则只存在函
数依赖 X→Y 。
例如, SNO与 AGE,DEPT之间均为 m, 1联系, 所以有
SNO→AGE, SNO→DEPT 。
③ 如果属性 X与 Y有 m,n的联系时, 则 X与 Y之间
不存在任何函数依赖关系 。
例如, 一个学生可以选修多门课程, 一门课程又可
以为多个学生选修, 所以 SNO与 CNO之间不存在函
数依赖关系 。
?
?
25
4,函数依赖关系的存在与时间无关 。
? 因为函数依赖是指关系中的所有元组应该满足的约
束条件,而不是指关系中某个或某些元组所满足的
约束条件。
? 因此,必须根据语义来确定属性之间的函数依赖,
而不能单凭某一时刻关系中的实际数据值来判断。
例如,对于关系模式 S,假设没有给出无重名的学
生这种语义规定,则即使当前关系中没有重名的记
录,也只能存在函数依赖 SNO→SN, 而 不能 存在函
数依赖 SN→SNO, 因为如果新增加一个重名的学生,
函数依赖 SN→SNO 必然不成立。
26
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。
27
5.3.5 完全函数依赖与部分函数依赖
定义 5.2 设关系模式 R(U),U是属性全集, X和 Y是 U的子
集, 如果 X→Y, 并且对于 X的任何一个真子集 X′,都有
X′ Y,则称 Y对 X完全函数依赖, 记作 X Y。 否则
称为部分函数依赖, 记为 X Y。
例如, 在关系模式 SCD中, 因为 SNO SCORE,且 CNO
SCORE,所以有,( SNO, CNO ) SCORE, 而
SNO→AGE, 所以 ( SNO,CNO) AGE。
? 由定义 5.2可知,只有当决定因素是组合属性时,讨论
部分函数依赖才有意义,当决定因素是单属性时,只
能是完全函数依赖。
? ?? f
? ?? f
? ?? p
? ?? p
28
5.3.6 传递函数依赖
定义 5.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→DEPT, 但 DEPT SNO,
而 DEPT→MN, 则有 SNO MN。 当学生不存在重名的情
况下, 有 SNO→SN, SN→SNO, SNO SN,SN→DEPT,
这时 DEPT对 SNO是 直接函数依赖, 而不是传递函数依
赖 。
??
? ?? t
?
? ?? t
?
29
? 综上所述, 函数依赖分为,
完全函数依赖
部分函数依赖
传递函数依赖
30
5.4 范式
?规范化的基本思想是消除关系模式中的数据冗余,
消除数据依赖中的不合适的部分,解决数据插入、删
除时发生异常现象。
?为不同程度的规范化要求而设立的不同标准称为 范
式 ( Normal Form)。由于规范化的程度不同,就产生
了 不同的范式 。
?至此在关系数据库规范中建立了一个范式系列:
1NF,2NF,3NF,BCNF,4NF,5NF,一级比一级有更严格的要
求。各个范式之间的联系可以表示为:
5NF 4NF BCNF 3NF 2NF 1NF,如图 5.5所示。? ? ? ? ?
31
图 5.5 各种范式之间的关系
32
5.4.1 第一范式 ( First Normal Form)
定义 5.4 如果关系模式 R,每个属性都是不可再分的原
子属性, 则称 R属于第一范式, 简称 1NF,记作 R?1NF。
?在关系数据库系统中只讨论规范化的关系,凡是非规
范化的关系模式必须化成规范化的关系。
?每个规范化的关系都属于 1NF,这也是它之所以称为
“第一”的原因。
33
然而, 一个关系模式仅仅属于第一范式是不适用
的 。 例如在 5.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
34
我们可以用函数依赖图表示以上函数依赖关系,如图 5.6所示。
SN
MN
SCORE
图 5.6 SCD中的函数依赖关系
SNO
CNO
P
P
f
?由此可见,在 SCD中,既存在完全函数依赖,又存在部
分函数依赖和传递函数依赖,如此复杂的函数依赖,导
致了数据操作中出现的种种弊端。因此必须用投影运算
将关系分解,去掉过于复杂的函数依赖关系,向更高一
级的范式进行转换。
35
5.4.2 第二范式
5.4.2.1 第二范式的定义
定义 5.5 如果关系模式 R?1NF,且每个非主属性都完全
函数依赖于 R的每个关系码, 则称 R属于 第二范式,简称
2NF,记作 R?2NF。
?在关系模式 SCD中,SNO,CNO为主属性,AGE,DEPT,
MN,MN,SCORE均为非主属性,经上述分析,存在非主属
性对关系码的部分函数依赖,所以 SCD 2NF。
?而如图 5.4所示的由 SCD分解的三个关系模式 S,D,SC,
其中 S的关系码为 SNO,D的关系码为 DEPT,都是单属性,
不可能存在部分函数依赖。
?而对于 SC,( SNO,CNO) SCORE。所以 SCD分解后,
消除了非主属性对关系码的部分函数依赖,S,D,SC均
属于 2NF。
? ?? f
?
36
? 经以上分析, 可以得到两个结论:
① 从 1NF关系中消除非主属性对关系码的部分函数依赖,
则可得到 2NF关系 。
② 如果 R的关系码为单属性, 或 R的全体属性均为主属性,
则 R?2NF。
37
5.4.2.2 2NF规范化
?2NF规范化是指把 1NF关系 模式通过投影分解转换成 2NF关
系模式的集合 。 分解时遵循的基本原则就是, 一事一地,,
让一个关系只描述一个实体或者实体间的联系 。 如果多于
一个实体或联系, 则进行投影分解 。
?下面以关系模式 SCD为例, 来说明 2NF规范化的过程
例 5.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分解成如下两个关
系,如图 5.7所示。
? ?? f
38
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 图 5.7 关系 SD和 SC
返回 P64
39
? SD?2NF,SC?2NF,而且前面已经讨论,SCD的这种分
解没有丢失任何信息,具有无损连接性。
? 分解后,SD和 SC的函数依赖分别如图 5.8和 5.9所示。
SNO
SN SNO
CNO
SCOREAGE
DEPT
MN
图 5.8 SD中的函数依赖关系 图 5.9 SC中的函数依赖关系
返回 P64
40
下面对 2NF规范化作形式化的描述:
? 设关系模式 R( X,Y,Z), R?1NF,但 R 2NF,其中,
X是 主码 属性, Y,Z是 非码属性, 且存在部分函数依赖,
X Y。 设 X可表示为 X1X2,其中 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 ?
41
5.4.2.3 2NF的缺点
?2NF的关系模式解决了 1NF中存在的一些问题, 但 2NF的
关系模式在进行数据操作时, 仍然存在着一些问题:
?数据冗余 。 每个系名和系主任的名字存储的次数等于该
系的学生人数 。
?插入异常 。 当一个新系没有招生时, 有关该系的信息无
法插入 。
?删除异常 。 某系学生全部毕业而没有招生时, 删除全部
学生的记录也随之删除了该系的有关信息 。
?更新异常 。 更换系主任时, 仍需改动较多的学生记录 。
42
?分析 SD中的函数依赖关系,
SNO→SN, SNO→AGE, SNO→DEPT, DEPT→MN,
SNO MN,非主属性 MN对主码 SNO传递依赖。
?存在上述问题,就是由于在 SCD中存在着非主属性对
主码的传递依赖。
?为此,对关系模式 SD还需进一步简化,消除这种传
递依赖,得到 3NF。
? ?? t
43
5.4.3 第三范式
5.4.3.1 第三范式的定义
定义 5.6 如果关系模式 R?2NF,且每个非主属性都不传
递依赖于 R的每个关系码, 则称 R属于第三范式,简称 3NF,
记作 R?3NF。
5.4.3.2 3NF规范化
?3NF规范化 是指把 2NF关系模式通过投影分解转换成 3NF
关系模式的集合 。
?和 2NF的规范化时遵循的原则相同, 即, 一事一地,,
让一个关系只描述一个实体或者实体间的联系 。
44
下面以 2NF关系模式 SD为例, 来说明 3NF规范化的过程 。
例 5.2 将 SD(SNO,SN,AGE,DEPT,MN)规范到 3NF。
? 分析 SD的属性组成, 可以判断, 关系 SD实际上描
述了两个实体:
? 一个为学生实体, 属性有 SNO,SN,AGE,DEPT;
? 另一个是系的实体, 其属性 DEPT和 MN。
? 根据分解的原则, 我们可以将 SD分解成如下两个关
系, 如图 5.10所示 。
S(SNO,SN,AGE,DEPT),描述学生实体;
D(DEPT,MN),描述系的实体。
45
S D
SNO SN AGE DEPT DEPT MN
S1 赵亦 17 计算机 计算机 刘伟
S2 钱尔 18 信息 信息 王平
S3 孙珊 20 信息 自动化 刘伟
S4 李思 21 自动化
对于分解后的两个关系 S和 D,主码分别为 SNO和 DEPT,
不存在非主属性对主码的传递函数依赖 。 因此, S?3NF,
D?3NF。
图 5.10 关系 S和 D
46
? 分解后, S和 D的函数依赖分别如图 5.10和 5.11所示 。
SNO
SN
DEPTAGE
DEPT
MN
图 5.10 S中的函数依赖关系图 图 5.11 D中的函数依赖关系图
由以上两图可以看出, 关系模式 SD由 2NF分解为 3NF后,
函数依赖关系变得更加简单, 既没有非主属性对码的部
分依赖, 也没有非主属性对码的传递依赖, 解决了 2NF
中存在的四个问题:
47
? 数据冗余降低 。 系主任的名字存储的次数与该系的学
生人数无关, 只在关系 D中存储一次 。
? 不存在插入异常 。 当一个新系没有学生时, 该系的信
息可以直接插入到关系 D中, 而与学生关系 S无关 。
? 不存在删除异常 。 要删除某系的全部学生而仍然保留
该系的有关信息时, 可以只删除学生关系 S中的相关学
生记录, 而不影响系关系 D中的数据 。
? 不存在更新异常 。 更换系主任时, 只需修改关系 D中一
个相应元组的 MN属性值, 从而不会出现数据的不一致
现象 。
48
3NF的不足:
? 3NF只限制了非主属性对码的依赖关系, 而没有限制主
属性对码的依赖关系 。 如果发生了这种依赖, 仍有可
能存在数据冗余, 插入异常, 删除异常和修改异常 。
这时, 则需对 3NF进一步规范化, 消除主属性对码的依
赖关系
? Boyce与 Codd共同提出了一个新范式的定义, 这就是
Boyce-Codd范式, 通常简称 BCNF或 BC范式 。 它弥补了
3NF的不足 。
49
5.3.4 BC范式
5.3.4.1 BC范式的定义
定义 5.7 如果关系模式 R?1NF,且所有的函数依赖 X→Y
( Y X),决定因素 X都包含了 R的一个候选码, 则称 R
属于 BC范式 ( Boyce-Codd Normal Form ), 记作
R?BCNF。
5.3.4.2 BCNF规范化
?BCNF规范化是指把 3NF关系模式通过投影分解转换成
BCNF关系模式的集合 。
?下面以 3NF关系模式 SNC为例, 来说明 BCNF规范化的过
程 。
?
50
例 5.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。
51
分解后, S1和 S2的函数依赖分别如图 5.12和 5.13所示 。
SNO SN
SNO
CNO
SCORE
图 5.12 S1中的函数依赖关系 图 5.13 S2中的函数依赖关系
? 关系 SNC转换成 BCNF后,数据冗余度明显降低。
?学生的姓名只在关系 S1中存储一次,学生要改名时,只
需改动一条学生记录中的相应的 SN值,从而不会发生修改
异常 。
52
例 5.4 设关系模式 TCS( T,C,S), T表示教师, C表示
课程, S表示学生 。 语义假设是, 每一位教师只讲授一
门课程;每门课程由多个教师讲授;某一学生选定某
门课程, 就对应于一确定的教师 。
? 根据语义假设, TCS的函数依赖是:
( S,C) → T,( S,T) → C,T→C 。
? 函数依赖图如图 5.14所示。
S
C
T
S
T
C
5.14 TCS中的函数依赖关系
53
?对于 TCS,( S,C) 和 ( S,T) 都是候选码, 两个候选
码相交, 有公共的属性 S。 TCS中不存在非主属性, 也就
不可能存在非主属性对码的部分依赖或传递依赖, 所以
TCS?3NF。
?但从 TCS的一个关系实例 ( 如图 5.15) 分析, 仍存在一
些问题 。
T
C
S
T1 C1 S1
T1 C1 S2
T2 C1 S3
T2 C1 S4
T3 C2 S2
T4 C2 S2
T4 C3 S2
图 5.15 关系 TCS
54
? 数据冗余 。 虽然每个教师只开一门课, 但每个选修该
教师的该门课程的学生元组都要记录这一信息 。
? 插入异常 。 当某门课程本学期不开, 自然就没有学生
选修 。 没有学生选修, 因为主属性不能为空, 教师上
该门课程的信息就无法插入 。 同样原因, 学生刚入校,
尚未选课, 有关信息也不能输入 。
? 删除异常 。 如果选修某门课程的学生全部毕业, 删除
学生记录的同时,随之也删除了教师开设该门课程的信
息 。
? 更新异常 。 当某个教师开设的某门课程改名后, 所有
选修该教师该门课程的学生元组都要进行修改, 如果
漏改某个数据, 则破坏了数据的完整性 。
55
?分析出现上述问题的原因在于主属性部分依赖于码,
( S,T) C,因此关系模式还继续分解, 转换成更高一
级的范式 BCNF,以消除数据库操作中的异常现象 。
?将 TCS分解为两个关系模式 ST( S,T) 和 TC( T,C),
消除函数依赖 ( S,T) C。 其中 ST的码为 S,TC的码为 T。
ST?BCNF,TC?BCNF。 这两个关系模式的函数依赖图分别
如图 5.16和 5.17所示 。
S T T C
图 5.16 ST中的函数依赖关系 图 5.17 TC中的函数依赖关系
? ?? p
? ?? p
56
关系模式 TCS由规范到 BCNF后, 使原来存在的四个异常问
题得到解决:
? 数据冗余降低 。 每个教师开设课程的信息只在 TC关系
中存储一次 。
? 不存在插入异常 。 对于所开课程尚未有学生选修的教
师信息可以直接存储在关系 TC中, 而对于尚未选修课
程的学生可以存储在关系 ST中 。
? 不存在删除异常 。 如果选修某门课程的学生全部毕业,
可以只删除关系 ST中的相关学生记录, 而不影响系关
系 TC中相应教师开设该门课程的信息 。
? 不存在更新异常 。 当某个教师开设的某门课程改名后,
只需修改关系 TC中的一个相应元组即可, 不会破坏数
据的完整性 。
57
? 如果一个关系数据库中所有关系模式都属于 3NF,则已
在很大程度上消除了插入异常和删除异常, 但由于可
能存在主属性对候选码的部分依赖和传递依赖, 因此
关系模式的分离仍不够彻底 。
? 如果一个关系数据库中所有关系模式都属于 BCNF,那
么在函数依赖的范畴内, 已经实现了模式的彻底分解,
消除了产生插入异常和删除异常的根源, 而且数据冗
余也减少到极小程度 。
58
5.5 关系模式的规范化
— 模式分解
5.5.1 问题的提出
例,教材 P108,有关系模式:
Course_teacher_schema(course_name,course_location
,course_capacity,teacher_number,teacher_name,te
acher_age,department_name)
被分解成如下两个模式:
? Course_deparetment_schema(course_name,course_lo
cation,course_capacity,department_name)
? Teacher_department_schema(teacher_number,teache
r_name,teacher_age,department_name)
分解之后进行查询时将出现意外情况, 称这样的分解为
有损分解 。
59
5.5.2 无损连接分解
设 R为关系模式,关系模式集 {R1,R2, ?, Rn}为 R
的一个分解,即,R=R1∪R 2 ∪? ∪R n。令 r是模式 R上的
关系,即 r( R),而 ri= Π Ri(r),于总有:
r? r1 ∞ r2 ∞? ∞ rn
令 C为数据库上的约束集合。如果对于模式 R上满足的所有
合法关系 r,均有:
r= Π R1(r) ∞ Π R2(r) ∞ ? Π Rn(r)
那么,{R1,R2, ?, Rn}就是关于 R的 无损连接分解 。
60
5.5.3 规范化 ( Normalization)
? 一个低一级范式的关系模式, 通过模式分解转化为若
干个高一级范式的关系模式的集合, 这种分解过程叫
作关系模式的 规范化 。
5.5.3.1 关系模式规范化的目标
① 是一个无损连接分解;
② 保持所有的函数依赖;
③ 分解后的模式最好是 BCNF或是 3NF
61
5.5.3,2 无损连接分解的充要条件
定理,设 R<U,F>的一个分解 ={R1<U1,F1>,R1<U2,F2>}
具有无损连接分解的条件是,U1∩ U2→ U1﹣ U2∈F +或
U1∩ U2→ U2﹣ U1∈F +。
?
62
5.5.3.3 关系模式规范化的步骤
? 规范化就是对原关系进行投影, 消除决定属性不是候
选码的任何函数依赖 。 具体可以分为以下几步:
① 对 1NF关系进行投影, 消除原关系中非主属性对码
的部分函数依赖, 将 1NF关系转换成若干个 2NF关
系 。
② 对 2NF关系进行投影, 消除原关系中非主属性对码
的传递函数依赖, 将 2NF关系转换成若干个 3NF关
系 。
③ 对 3NF关系进行投影, 消除原关系中主属性对码的
部分函数依赖和传递函数依赖, 也就是说使决定
因素都包含一个候选码 。 得到一组 BCNF关系 。
63
关系规范化的基本步骤如图 5.18所示。
1NF
2NF
3NF
BCNF
消除决定属性
不是候选码的
非平凡的函数
依赖
消除非主属性对码的部分函数依赖
消除非主属性对码的传递函数依赖
消除主属性对码的部分和传递函数依赖
图 5.18 规范化过程
?一个不好的关系模式分解转换成好的关系模式的集合时要全面衡量,
综合考虑,视实际情况而定。
?对于那些只要求查询而不要求插入、删除等操作的系统,几种异常
现象的存在并不影响数据库的操作。这时便不宜过度分解,否则当要
对整体查询时,需要更多的多表连接操作,这有可能得不偿失。
?在实际应用中,最有价值的是 3NF和 BCNF,在进行关系模式的设计
时,通常分解到 3NF就足够了。
64
5.5.3.4 模式分解实例
[实例 ] 对于 讲义 P38图 5.7表 SD中的关系模式
SD(SNO,SN,AGE,DEPT,MN),
其函数依赖 见 P39图 5.8。
要求规范到 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 。 分
解既具有无损连接性, 又具有函数依赖保持性 。
? 这是一种正确的分解方法。
65
? 第二种:
S1(SNO,SN,AGE,DEPT)
D1(SNO,MN)
? 分解后的关系如图 5.18所示 。
S1 D1
SNO SN AGE DEPT SNO MN
S1 赵亦 17 计算机 S1 刘伟
S2 钱尔 18 信息 S2 王平
S3 孙珊 20 信息 S3 王平
S4 李思 21 自动化 S4 刘伟
图 5.18 关系 S1和 D1
66
? 分解以后, 两个关系的主码都为 SNO,也不存在非主属性对
主码的传递函数依, 所以两个关系均属于 3NF。
? 且 SD=S1*D1,关系模式 SD等于 S1和 D1在 SNO上的自然连接,
这种分解也具有无损连接性, 保证不丢失原关系中的信息 。
但这种分解结果, 仍然存在着一些问题:
1,数据冗余 。 每个系名和系主任的名字存储的次数
等于该系的学生人数 。
2,插入异常 。 当一个新系没有招生时, 系主任的名
字则无法插入 。
3,删除异常 。 某系学生全部毕业而没有招生时, 要
删除全部学生的记录, 两个关系都要涉及, 有关该
系的信息将被删除 。
4,更新异常 。 更换系主任时, 需改动较多的学生记
录 。 另外, 某个学生要转系, 还必须修改两个关系 。
67
? 之所以存在上述问题, 是因为分解得到的两个关系模
式不是相互独立的 。
? SD中的函数依赖 DEPT→MN 既没有投影到关系模式 S1上,
也没有投影到关系模式 D1上, 而是跨在这两个关系模
式上, 也就是说这种分解方法 没有保持原关系中的函
数依赖, 却用了原关系隐含的传递函数依赖
SNO MN。
? 分解只具有无损连接性, 而 不具有函数依赖保持性 。
因此,, 弊病, 仍然没有解决 。
? ?? t
68
? 第三种:
S2(SNO,SN,AGE,MN)
D2(DEPT,MN)
? 分解后的关系如图 5.19所示 。
S2 D2
SNO SN AGE MN DEPT MN
S1 赵亦 17 刘伟 计算机 刘伟
S2 钱尔 18 王平 信息 王平
S3 孙珊 20 王平 自动化 刘伟
S4 李思 21 刘伟
图 5.19 关系 S2和 D2
69
? 分解以后, 两个关系均为 3NF,公共属性为 MN,
但 MN SNO,MN DEPT,所以 S2*D2≠SD 。
? S2和 D2在 MN上的自然连接的结果如图 5.20。
SNO SN AGE DEPT MN
S1 赵亦 17 计算机 刘伟
S1 赵亦 17 自动化 刘伟
S2 钱尔 18 信息 王平
S3 孙珊 20 信息 王平
S4 李思 21 计算机 刘伟
S4 李思 21 自动化 刘伟
图 5.20 S2和 D2的自然连接
70
? S2*D2比原来的关系 SD多了两个元组 ( S1,赵亦, 17,
自动化, 刘伟 ) 和 ( S4,李思, 21,计算机, 刘伟 ),
因此也无法知道原来的 SD关系中究竟有哪些元组, 从
这个意义上说, 此分解方法仍然丢失了信息 。 所以其
分解是不可恢复的 。
? 另外, 这种分解方法只保持了原来的 SD中的 DEPT→MN
这个完全函数依赖而未用另外一个 SNO→DEPT 完全依赖,
却用了原关系的传递函数依赖 SNO MN。 所以分解既
不具有无损连接性, 也 不具有函数依赖保持性, 同样
存在着数据操作的异常情况 。
? ?? t
71
几点说明:
? 经以上几种分解方法的分析, 如果一个分解具有无损
连接性, 则能够保证不丢失信息 。 如果一个分解具有
函数依赖保持性, 则可以减轻或解决各种异常情况 。
? 分解具有无损连接性和函数依赖保持性是两个相互独
立的标准 。 具有无损连接性的分解不一定具有函数依
赖保持性 。 同样, 具有函数依赖保持性的分解也不一
定具有无损连接性 。
? 规范化理论提供了一套完整的模式分解算法 ( 见萨师
煊, 王珊 数据库系统概论 ), 按照这套算法可以做
到:如果要求分解既具有无损连接性, 也具有函数依
赖保持性, 且分解一定能够达到 3NF。
72
? 所以在 3NF的规范化中, 既要检查分解是否具有无损连
接性, 又要检查分解是否具有函数依赖保持性 。 只有
这两条都满足, 才能保证分解的正确性和有效性, 既
保证不会发生信息丢失, 又保证关系中的数据满足完
整性约束 。
73
小 结
? 在这一章,我们首先由关系模式的存储异常问题引出了函数依赖
的概念,其中包括完全函数依赖、部分函数依赖和传递函数依赖,
这些概念是规范化理论的依据和规范化程度的准则。
? 规范化就是对原关系进行投影,消除决定属性不是候选码的任何
函数依赖。
? 一个关系只要其分量都是不可分的数据项,就可称作规范化的关
系,也称作 1NF。
? 消除 1NF关系中非主属性对码的部分函数依赖,得到 2NF,消除
2NF关系中非主属性对码的传递函数依赖,得到 3NF,消除 3NF关
系中主属性对码的部分函数依赖和传递函数依赖,便可得到一组
BCNF关系。
? 在规范化过程中,逐渐消除存储异常,使数据冗余尽量小,便于
插入、删除和更新。
? 规范化的基本原则就是遵从概念单一化“一事一地”的原则,即
一个关系只描述一个实体或者实体间的联系。
? 规范化的投影分解方法不是唯一的,对于 3NF的规范化,分解既
要具有无损连接性,又要具有函数依赖保持性。