6.1 问题的提出
- 针对具体问题,应该如何构造一个适合于它的数据库模式,即应该构造几个关系模式,每个关系由哪些属性组成等。
- 人们以关系模型为背景讨论这个问题,形成了数据库逻辑设计的工具——关系数据库的规范化理论。
关系模式是一个五元组: R(U,D,DOM,F)
- 关系名 R 是符号化的元组语义
- U 为一组属性
- D 为 U 中的属性所来自的域
- DOM 为属性到域的映射
- F 为 U 上的一组数据依赖
由于 D、DOM 与模式设计关系不大,因此在本章中把关系模式看作一个三元组: R<U,F> 。
当且仅当 U 上的一个关系 r 满足 F 时, r 称为关系模式 R 的一个关系。
作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分的数据项。满足了这个条件的关系模式就属于第一范式(1NF)。
数据依赖
- 一个关系内部属性与属性之间的一种约束关系
- 通过属性间值的相等与否体现出来的数据间相关联系
- 是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现
数据依赖的主要类型:函数依赖(Functional Dependency,FD)、多值依赖(Multi-Valued Dependency,MVD)
函数依赖普遍存在于现实生活中
例:描述一个学生关系,可以有学号、姓名、系名等属性。
- 一个学号只对应一个学生,一个学生只在一个系中学习
- “学号”值确定后,学生的姓名及所在系的值就被唯一确定
Sname=f(Sno) , Sdept=f(Sno)
即 Sno 函数决定 Sname , Sno 函数决定 Sdept ,记作 Sno→Sname , Sno→Sdept
【例 6.1】建立一个描述学校教务的数据库,涉及的对象包括:学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程号(Cno)、成绩(Grade)。
假设学校教务的数据库模式用一个单一的关系模式 Student 来表示,则该关系模式的属性集合为:
U={Sno,Sdept,Mname,Cno,Grade}
现实世界的已知事实(语义):
① 一个系有若干学生,但一个学生只属于一个系
② 一个系只有一名(正职)负责人
③ 一个学生可以选修多门课程,每门课程有若干学生选修
④ 每个学生学习每一门课程有一个成绩
得到属性组 U 上的一组函数依赖 F :
F={Sno→Sdept,Sdept→Mname,(Sno,Cno)→Grade}
Student 上的一组函数依赖
Student 表
关系模式 Student 中存在的问题:
(1)数据冗余
浪费大量的存储空间。比如,每一个系的系主任姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。
(2)更新异常(update anomalies)
数据冗余,更新数据时,维护数据完整性代价大。比如,某系更换系主任后,必须修改与该系学生有关的每一个元组。
(3)插入异常(insertion anomalies)
如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
(4)删除异常(deletion anomalies)
如果某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系及其系主任的信息也丢掉了。
结论:
- Student 关系模式不是一个好的模式。
- 一个“好”的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽可能少。
原因:这个模式中的函数依赖存在某些不好的性质。
解决方法:用规范化理论改造关系模式来消除其中不合适的函数依赖。
把这个单一的模式分成三个关系模式:
S(Sno,Sdept,Sno→Sdept)
SC(Sno,Cno,Grade,(Sno,Cno)→Grade)
DEPT(Sdept,Mname,Sdept→Mname)
这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。
6.2 规范化
6.2.1 函数依赖
定义 6.1:设 R(U) 是属性集 U 上的关系模式, X 和 Y 是 U 的子集。若对于 R(U) 的任意一个可能的关系 r , r 中不可能存在两个元组在 X 上的属性值相等,而在 Y 上的属性值不等,则称 X 函数确定 Y 或 Y 函数依赖于X ,记作 X→Y 。
函数依赖和别的数据依赖一样是语义范畴的概念,只能根据语义来确定一个函数依赖。例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立。
- X→Y,但 Y⊈X,则称 X→Y 是非平凡的函数依赖。
- X→Y,但 Y⊆X,则称 X→Y 是平凡的函数依赖。对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。若不特别声明,总是讨论非平凡函数依赖。
- 若 X→Y,则 X 称为这个函数依赖的决定属性组,也称为决定因素(determinant)。
- 若 X→Y,Y→X,则记作 X←→Y 。
- 若 Y 不函数依赖于X,则记作 X↛Y。
定义:在 R(U) 中,如果 X→Y,并且对于 X 的任何一个真子集 X′ , 都有 X′↛Y, 则称 Y 对 X 完全函数依赖,记作 X→FY 。
若 X→Y,但 Y 不完全函数依赖于 X,则称 Y 对 X 部分函数依赖,记作 X→PY 。
定义:在 R(U) 中,如果 X→Y (Y⊈X) , Y↛X , Y→Z , Z⊈Y ,则称 Z 对 X 传递函数依赖(transitive functional dependency)。记为: 传递X→传递Z 。
例 6.1 中 (Sno,Cno)→FGrade 是完全函数依赖, (Sno,Cno)→PSdept 是部分函数依赖。
Sno→Sdept , Sdept→Mname 成立,所以 传递Sno→传递Mname 。
6.2.2 码
定义:设 K 为 R 中的属性或属性组合。若 K→FU ,则 K 称为 R 的候选码(candidate key)。
如果 U 部分函数依赖于 K,即 K→PU ,则 K 称为超码(surpkey)。候选码是最小的超码,即 K 的任意一个真子集都不是候选码。
若关系模式 R 有多个候选码,则选定其中的一个为主码(primary key)。
主属性与非主属性
- 包含在任何一个候选码中的属性,称为主属性(prime attribute)
- 不包含在任何候选码中的属性称为非主属性(nonprime attribute)或非码属性(non-key attribute)
最简单的情况,单个属性是码;最极端的情况,整个属性组是码,称为全码(all-key)。
【例 6.2】S(Sno_,Sdept,Sage),单个属性 Sno 是码, SC(Sno,Cno_,Grade) 中,属性组合 (Sno,Cno) 是码。
【例 6.3】关系模式 R(P,W,A_) ,P 表示演奏者,W 表示作品,A 表示听众。一个演奏者可以演奏多个作品,某一作品可被多个演奏者演奏,听众可以欣赏不同演奏者的不同作品这个关系模式的码为( P,W,A ),即全码。
定义:关系模式 R 中属性或属性组 X 并非 R 的码,但 X 是另一个关系模式的码,则称 X 是 R 的外部码(foreign key),也称外码。
6.2.3 范式
- 范式是符合某一种级别的关系模式的集合。
- 关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。
- 满足最低要求的叫第一范式,简称 1NF。
范式之间存在联系:
5NF ⊂ 4NF ⊂ BCNF ⊂ 3NF ⊂ 2NF ⊂ 1NF
某一关系模式 R 为第 n 范式,可简记为 R∈ NF。
各种范式之间的关系
一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(normalization)。
6.2.4 2NF
定义:若关系模式 R∈ 1NF,且每一个非主属性完全函数依赖于任何一个候选码,则 R∈ 2NF。
【例 6.4】S-L-C(Sno, Sdept, Sloc, Cno, Grade),Sloc 为学生的住处,并且每个系的学生住在同一个地方。S-L-C的码为 (Sno,Cno),则函数依赖有:
(Sno, Cno) →F Grade
Sno → Sdept, (Sno, Cno) →P Sdept
Sno → Sloc, (Sno, Cno) →P Sloc
Sdept → Sloc(每个系的学生只住一个地方)
函数依赖如图所示。
函数依赖示例
图中用虚线表示部分函数依赖。可以看到非主属性 Sdept、Sloc 并不完全函数依赖于码,因此 S-L-C ∉ 2NF。
一个关系模式不属于 2NF,会产生以下问题:
(1)插入异常。如果插入一个新学生,但该生还未选课,即该生无 Cno,由于插入元组时必须给定码值,因此插入失败。
(2)删除异常。如果 S4 只选了一门课 C3,现在他不再选这门课,那么 C3 这个数据项就要删除;而 C3 是主属性,删除了 C3,整个元组就必须一起删除,使得 S4 的其他信息也被删除了。
(3)修改复杂。如果一个学生选了多门课,则 Sdept,Sloc 被存储了多次。如果该生转系,则需要修改所有相关的 Sdept 和 Sloc,造成修改的复杂化。
解决的办法是用投影分解把关系模式 S-L-C 分解成两个关系模式:SC(Sno,Cno,Grade) 和 S-L(Sno,Sdept,Sloc)。
关系模式 SC 与 S-L 中属性间的函数依赖如图所示。
SC 的码为 (Sno,Cno),S-L 的码为 Sno,这样就使得非主属性对码都是完全函数依赖了。
6.2.5 3NF
定义:设关系模式 R∈ 1NF,若 R 中不存在这样的码 X, 属性组 Y 及非主属性 Z(Z⊈Y), 使得 X→Y ,Y→Z 成立,Y↛X , 则称 R∈ 3NF。
关系模式 SC 没有传递依赖,关系模式 S-L 存在非主属性对码的传递依赖。因此 SC ∈ 3NF,S-L ∉ 3NF。
一个关系模式 R 如果不是 3NF,就会产生于2NF 相类似的问题。
解决的办法是将 S-L 分解成 S-D(Sno,Sdept) ∈ 3NF 和 D-L(Sdept,Sloc) ∈ 3NF。分解后的关系模式 S-D 与 D-L 中不再存在传递依赖。
6.2.6 BCNF
定义:设关系模式 R∈ 1NF,若 X→Y 且 Y⊈X 时 X 必含有码,则 R∈ BCNF。
也就是说,关系模式 R 中,若每一个决定因素都包含码, 则 R∈ BCNF。
满足 BCNF 的关系模式所具有的性质:
- 所有非主属性对每一个候选码都是完全函数依赖。
- 所有主属性对每一个不包含它的候选码也是完全函数依赖。
- 没有任何属性完全函数依赖于非码的任何一组属性。
【例 6.5】考察关系模式 C(Cno,Cname,Pcno),它只有一个码 Cno,没有任何属性对 Cno 部分依赖或传递依赖, 所以 C ∈ 3NF。同时 C 中 Cno 是唯一的决定因素,所以 C ∈ BCNF。
【例 6.6】关系模式 S(Sno,Sname,Sdept,Sage),假定 Sname 也具有唯一性,那么 S 就有两个码,这两个码都由单个属性组成,彼此不相交。其他属性不存在对码的传递依赖与部分依赖,所以 S ∈ 3NF。同时 S 中除 Sno,Sname 外没有其他决定因素,所以 S 也属于 BCNF。
【例 6.7】关系模式 SJP(S,J,P) 中, S 是学生,J 表示课程,P 表示名次。每一个学生选修每门课程的成绩有一定的名次,每门课程中每一名次只有一个学生(即没有并列名次)。
由语义可得到函数依赖:()(S,J)→P ;()(J,P)→S
()(S,J)与()(J,P)都可以作为候选码。
关系模式中没有属性对码传递依赖或部分依赖,所以 SJP∈ 3NF。
除()(S,J)与()(J,P)以外没有其他决定因素,所以 SJP∈ BCNF。
【例 6.8】关系模式 STJ(S,T,J) 中,S 表示学生,T 表示教师,J 表示课程。每一教师只教一门课,每门课有若干教师,某一学生选定某门课,就对应一个固定的教师。由语义可得到函数依赖:()(S,J)→T ;()(S,T)→J , T→J 。
STJ 中的函数依赖
因为没有任何非主属性对码传递依赖或部分依赖,STJ∈ 3NF。
因为 T 是决定因素,而 T 不包含码, 所以 STJ∉ BCNF。
6.2.7 多值依赖
【例 6.9】学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。每个教师可以讲授多门课程,每种参考书可以供多门课程使用。用关系模式 Teaching(C,T,B) 来表示课程 C、教师 T 和参考书 B 之间的关系。
Teaching 具有唯一候选码 (C,T,B),即全码,因而 Teaching ∈ BCNF。
存在问题:
(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 值无关。
多值依赖的另一个等价的定义
在 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。
若 X→→Y,而 Z=ϕ,即 Z 为空,则称 X→→Y 为平凡的多值依赖。
【例 6.10】关系模式 WSC(W,S,C) 中,W 表示仓库,S 表示保管员,C 表示商品。假设每个仓库有若干个保管员,有若干种商品。每个保管员保管所在仓库的所有商品,每种商品被所有保管员保管。
按照语义对于 W 的每一个值 Wi,S 有一个完整的集合与之对应而不问 C 取何值。所以 W→→S。
W→→S 且 W→→C
对应 W 的某一个值 Wi 的全部 S 值记作 {S}Wi(表示此仓库工作的全部保管员),全部 C 值记作 {C}Wi(表示在此仓库中存放的所有商品),应当有 {S}Wi中的每一个 S 值和 {C}Wi中的每一个 C 值对应。于是 {S}Wi与 {C}Wi之间正好形成一个完全二分图,因而 W→→S。
由于 C 与 S 的完全对称性,必然有 W→→C 成立。
多值依赖的性质
(1)多值依赖具有对称性。即若 X→→Y,则 X→→Z,其中Z=U−X−Y。
多值依赖的对称性可以用完全二分图直观地表示出来。
从例 6.10 容易看出,因为每个保管员保管所有商品,同时每种商品被所有保管员保管,显然若 W→→S,必然有 W→→C。
(2)多值依赖具有传递性。即若 X→→Y,Y→→Z ,则 X→→Z−Y。
(3)函数依赖是多值依赖的特殊情况。即若 X→Y,则 X→→Y。
(4)若 X→→Y,X→→Z,则 X→→YZ。
(5)若 X→→Y,X→→Z,则 X→→Y∩Z。
(6)若 X→→Y,X→→Z,则 X→→Y−Z,X→→Z−Y。
多值依赖与函数依赖的区别
(1)多值依赖的有效性与属性集的范围有关
若 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) 的任何一个关系 r 中,元组在 X 和 Y 上的值满足定义 6.1,则函数依赖 X→Y 在任何属性集 W(XY⊆W⊆U)上成立。
(2)若函数依赖 X→Y 在 R(U) 上成立,则对于任何 Y′⊂Y 均有 X→Y′ 成立。而多值依赖 X→→Y 若在 R(U) 上成立,却不能断言对于任何 Y′⊂Y 有 X→→Y′成立。
例如,有关系 R(A,B,C,D),A→→BC 成立,当然也有 A→→D 成立。有 R 的一个关系实例,在此实例上 A→→B 是不成立的,如表所示。
R 的一个实例
6.2.8 4NF
定义:关系模式 R∈ 1NF,如果对于 R 的每个非平凡多值依赖 X→→Y(Y⊈X),X 都含有码,则称 R∈ 4NF。
4NF 就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。4NF 所允许的非平凡多值依赖实际上是函数依赖。
可以用投影分解的方法消去非平凡且非函数依赖的多值依赖。
函数依赖和多值依赖是两种最重要的数据依赖。
- 如果只考虑函数依赖,则属于 BCNF 的关系模式规范化程度已经是最高的。
- 如果考虑多值依赖,则属于 4NF 的关系模式规范化程度是最高的。
6.2.9 规范化小结
- 在关系数据库中,对关系模式的基本要求是满足第一范式。
- 规范化程度过低的关系不一定能够很好地描述现实世界,可能存在插入异常、删除异常、修改复杂、数据冗余等问题。解决方法就是对其进行规范化,转换成高级范式。
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化。
- 关系数据库的规范化理论是数据库逻辑设计的工具。
规范化的基本思想
- 逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”
- 即采用“一事一地”的模式设计原则:让一个关系描述一个概念、一个实体或者实体间的一种联系,若多于一个概念就把它“分离”出去
- 因此规范化实质上是概念的单一化
规范化过程
不能说规范化程度越高的关系模式就越好,必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。上面的规范化步骤可以在其中任何一步终止。
6.3 数据依赖的公理系统
定义:对于满足一组函数依赖 F 的关系模式 R<U,F>,其任何一个关系 r,若函数依赖 X→Y 都成立(即 r 中任意两元组 t、s,若 t[X]=s[X],则 t[Y]=s[Y]),则称 F 逻辑蕴涵 X→Y。
Armstrong 公理系统(Armstrong's axiom)
设 U 为属性集总体,F 是 U 上的一组函数依赖,于是有关系模式 R,对 R 来说有以下的推理规则:
A1 自反律(reflexivity rule):若 Y⊆X⊆U,则 X→Y 为 F 所蕴涵。
A2 增广律(augmentation rule):若 X→Y 为 F 所蕴涵,且 Z⊆U,则XZ→YZ 为 F 所蕴涵。
注:XZ 表示 X∪Z。
A3 传递律(transitivity rule):若 X→Y 及 Y→Z 为 F 所蕴涵,则 X→Z 为 F 所蕴涵。
注:由自反律所得到的函数依赖均是平凡的函数依赖,自反律的使用并不依赖于 F。
定理:Armstrong 推理规则是正确的。
根据 A1、A2、A3 这三条推理规则可以得到下面三条很有用的推理规则。
- 合并规则(union rule):由 X→Y,X→Z ,有 X→YZ。
- 伪传递规则(pseudo transitivity rule):由 X→Y,WY→Z,有 XW→Z。
- 分解规则(decomposition rule):由 X→Y 及 Z⊆Y,有 X→Z。
引理 6.1:X→A1A2⋯Ak 成立的充分必要条件是 X→Ai 成立 (i=1,2,⋯,k)。
定义:在关系模式 R<U,F> 中为 F 所逻辑蕴涵的函数依赖的全体叫作 F 的闭包(closure),记为 F+。
人们把自反律、传递律和增广律称为 Armstrong 公理系统。
Armstrong 公理系统是有效的、完备的。
- 有效性:由 F 出发根据 Armstrong 公理推导出来的每一个函数依赖定在 F+ 中。
- 完备性:F 中的每一个函数依赖,必定可以由 F 出发根据 Armstrong 公理推导出来。
定义:设 F 为属性集 U 上的一组函数依赖,X、Y⊆U ,能由根据公理导出XF+={A|X→A 能由 F 根据 Armstrong 公理导出} ,XF+ 称为属性集 X 关于函数依赖集 F 的闭包。
由引理 6.1 容易得出引理 6.2。
引理 6.2:设 F 为属性集 U 上的一组函数依赖,X、Y⊆U,X→Y 能由 F 根据 Armstrong 公理导出的充分必要条件是 Y⊆XF+。
定理:Armstrong 公理系统是有效的、完备的。
Armstrong 公理的完备性及有效性说明了“导出”和“蕴涵”是两个完全等价的概念。
从蕴涵(或导出)的概念出发,又引出了两个的数依赖集等价和最小依赖集的概念。
定义:如果 G+=F+ ,就说函数依赖集 F 覆盖 G (F 是 G 的覆盖,或 G 是 F 的覆盖),或 F 与 G 等价。
引理:F+=G+的充分必要条件是 F+⊆G+和 G⊆F+。
定义:如果函数依赖集 F 满足下列条件,则称 F 为一个极小函数依赖集,亦称为最小依赖集或最小覆盖(minimal cover)。
(1)F 中任一函数依赖的右部仅含有一个属性。
(2)F 中不存在这样的函数依赖 X→A,使得 F 与 F−{X→A} 等价。
(3)F 中不存在这样的函数依赖 X→A,X 有真子集 Z 使得F−{X→A}∪{Z→A} 与 F 等价。
定理:每一个函数依赖集 F 均等价于一个极小函数依赖集 Fm。此 Fm 称为 F 的最小依赖集。