数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 1页第 6章 关系模式的规范化设计本章概述本章的学习目标主要内容数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 2页本章概述
前面 4章研究了如何建立数据模型的问题,并且把所建立的数据模型转换成最流行的关系模式。
在我们研究如何把所建立的数据库模型转变成关系模式时,发现了一些数据冗余的问题,即客观世界中的一个事实在关系元组中重复出现。这些问题影响了关系模式的设计和使用,因此需要采取合适的方法来消除这些设计过程中的问题。
本章将要讲述的关系模式的规范化设计就是这些问题的解决方案。规范化设计就是在函数依赖理论基础上,通过对关系模式的进行不同层次的分解,使最终得到的关系模式符合用户的需要。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 3页本章的学习目标
了解关系模式设计时的数据异常问题;
了解和掌握函数依赖的基本概念;
掌握计算属性闭包的基本方法;
掌握关系模式分解的基本原理;
了解关系模式范式的基本概念和类型;
掌握各种范式设计的基本技术和原则。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 4页主要内容
6.1 概述
6.2 函数依赖
6.3 关系模式的分解
6.4 关系模式的范式
6.5 多值依赖
6.6 范式之间的关系
6.7 数据库模式的实例
6.8 本章小结数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 5页
6.1 概述
异常问题
数据冗余
修改异常
插入异常
删除异常数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 6页泛关系模式和数据库模式
在关系模式设计过程中,应该采取一些方法消除这些数据异常现象,把最初的关系模式分解成最终的合适的关系模式。这种最初设计的关系模式也称为泛关系模式
(universal relation scheme)。关系模式的当前值称为关系实例,关系实例是特定元组的集合。
可以把泛关系模式分解成一系列小的符合规范化要求的关系模式集合,这种比较小的最终的关系模式的集合称为数据库模式 (database scheme)。对数据库模式的每一个关系模式赋予一个当前值,这时称为数据库实例。
关系模式规范化设计的过程就是首先设计出泛关系模式,
然后根据范式理论,对不符合用户需求的泛关系模式分解成一系列关系集合,最后得到符合用户需求的数据库模式。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 7页主要内容
6.1 概述
6.2 函数依赖
6.3 关系模式的分解
6.4 关系模式的范式
6.5 多值依赖
6.6 范式之间的关系
6.7 数据库模式的实例
6.8 本章小结数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 8页
6.2 函数依赖
数据依赖是数据之间存在的各种联系现象。
数据异常现象与数据依赖有着紧密的关联。
在数据依赖中,函数依赖是最基本的一种依赖形式。
认识和掌握函数依赖知识,对于数据库的约束设计和规范化设计有着重要的意义。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 9页函数依赖的定义
函数依赖 (Function Dependency,
FD)的定义可以这样叙述:如果关系 R的两个元组在属性 A1,
A2,…,An上一致,那么它在另一个属性 B上也一致。这种函数依赖记作 A1A2…An→B,读作属性
A1,A2,…,An函数决定属性 B,
或属性 B函数依赖于属性 A1,
A2,…,An。
函数依赖的逻辑定义:设关系模式 R的属性集是 U,X和 Y是 U的子集,函数依赖是形如 X→Y 的命题,
即 r是 R的当前实例值,对 r中的任意两个元组 t和 s,如果 t[X]=s[X],
则 t[Y]=s[Y],那么 X→Y 在关系模式 R中成立。其中,t[X]表示元组 t
在属性集 X上的值。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 10页函数依赖和键码
前面我们已经多次提到了键码的概念,但是还没有为键码提供一个规范的定义。
这里,我们从函数依赖的角度,给出一个规范的键码定义。
超键码
在某个关系中,如果一个或多个属性的集合 {A1,
A2,…,An}函数决定该关系的其他属性,那么称该属性的集合为该关系的超键码。超键码的含义是关系中不可能存在两个不同的元组在属性 A1,A2,…,
An的取值完全相同。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 11页键码
在前面的超键码定义中,范围太宽,使得超键码过多,使用起来很不方便。
现在,在超键码定义的基础上,增加一些限制条件来定义键码。
在某个关系中,如果一个或多个属性的集合 {A1,
A2,…,An}函数决定该关系的其他属性,并且集合
{A1,A2,…,An}的任何真子集都不能函数决定该关系的所有其他属性,那么称该属性的集合为该关系的键码。
键码的定义包括两方面的含义,即关系中不可能存在两个不同的元组在属性 A1,A2,…,An的取值完全相同,且键码必须是最小的。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 12页逻辑蕴含
在讨论函数依赖时,经常需要从一些已知的函数依赖去判断另外一些函数依赖是否成立。例如,
如果 A→B 和 B→C 在某个关系中成立,那么 A→C
在该关系中是否成立的问题称为逻辑蕴含问题。
假定 F是在某个关系上成立的函数依赖集,T是在该关系上成立的另外一个函数依赖集。如果对于该关系中满足 F的每一个关系实例都满足 T,那么称函数依赖集 F蕴含于函数依赖集 T,记作 F蕴含于 T。
如果 F蕴含于 T,且 T蕴含于 F,那么函数依赖集 F
和 T是等价的。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 13页函数依赖的推理规则
分解规则:可以把一个函数依赖A1A2…An→B1B2…Bm 用一组函数依赖A1A2…An→B1,
A1A2…An→B2,…,
A1A2…An→Bm 来代替。
合并规则:可以把一组函数依赖 A1A2…An→B1,
A1A2…An→B2,…,
A1A2…An→Bm 用一个函数依赖A1A2…An→B1B2…Bm 来代替。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 14页属性集的闭包
在关系模式的设计中,经常需要判断某个给定的函数依赖是否蕴含于给定的函数依赖集。使用闭包就可以达到这一点。
假设 {A1,A2,…,An}是属性集,S是函数依赖集。属性集 {A1,A2,…,An}在函数依赖集 S下的闭包是这样的属性集 B,它使得满足依赖集 S中所有依赖的每一个关系也都满足 A1A2…An→B 。
也就是说,A1A2…An→B 蕴含于 S中的函数依赖。
使用 {A1,A2,…,An}+表示属性集 A1,
A2,…,An的闭包。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 15页计算属性集闭包的流程图数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 16页正则覆盖
假设在某个关系模式上有函数依赖集 S,那么在该关系上作任何更新时,数据库系统都要保证 S
中的所有函数依赖在新数据库状态下仍然满足,
否则就取消这种更新操作。因此,数据库系统要对更新操作进行检测,系统的检测开销也比较大。
为了降低检测开销,在不改变闭包的情况下,可以简化给定的函数依赖。由于闭包相同,所以满足简化后的函数依赖集的数据库也一定满足原依赖集,反之亦然。并且,简化后的函数依赖集合更加容易检测。简化后的集合可以使用正则覆盖方法构造。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 17页主要内容
6.1 概述
6.2 函数依赖
6.3 关系模式的分解
6.4 关系模式的范式
6.5 多值依赖
6.6 范式之间的关系
6.7 数据库模式的实例
6.8 本章小结数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 18页
6.3 关系模式的分解
消除关系模式中数据异常的常用方法是分解关系模式。关系模式 R的分解就是把关系 R中的属性分开,以构成两个新的关系模式。
在分解关系模式时,一定要注意两个问题:
第一,保证分解前后关系模式的信息不能丢失和增加,保持原有的信息不变,这称为无损连接。
第二,保持分解前后原有的函数依赖依然成立。
给定一个关系模式 R,其属性集合为 {A1,A2,…,An},现在把其分解成两个关系模式 X和 Y,其属性集合分别是 {B1,B2,…,Bm}
和 {C1,C2,…,Ck},这种分解应该满足如下条件:
第一个条件,{A1,A2,…,An}={B1,B2,…,Bm}∪ {C1,C2,…,
Ck}。
第二个条件,关系 X中的元组是关系 R的所有元组在 {B1,B2,…,Bm}
上的投影,包含相同的元组。
第三个条件,关系 Y中的元组是关系 R的所有元组在 {C1,C2,…,Ck}
上的投影,不包含相同的元组。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 19页主要内容
6.1 概述
6.2 函数依赖
6.3 关系模式的分解
6.4 关系模式的范式
6.5 多值依赖
6.6 范式之间的关系
6.7 数据库模式的实例
6.8 本章小结数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 20页
6.4 关系模式的范式
前面讲过,在关系模式的分解中,函数依赖起着重要的作用。那么模式是否分解和模式分解之后的好坏,用什么标准来衡量呢?这种标准就是关系模式的范式 (Normal
Form,NF)。
范式的种类与函数依赖有着直接的联系,
在众多的范式类型中,最重要的范式是第三范式和 BC范式。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 21页第一范式
第一范式是最基本的范式。如果关系模式 R中的所有属性值都是不可再分解的原子值,那么就称关系 R是第一范式 (First Normal Form,1NF)的关系模式。
不是 1NF的关系称为非规范化的关系,满足 1NF
的关系称简为关系。在关系型数据库管理系统中,
涉及到的研究对象都是满足 1NF的规范化关系。
但是,关系中的属性是否都是原子的,取决于实际研究对象的重要程度。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 22页
BCNF范式
前面我们讲过,模式分解的目的在于使用几个不存在异常的关系代替原来存在异常现象的关系。
如何判断这种异常现象,可以使用 BCNF范式
(Boyce-Codd Normal Form)。该范式是 Boyce
在 Codd提出的范式理论基础上研究得到的。
BCNF的定义是,如果某个关系 R有非平凡依赖
A1,A2,…,An→B,那么 {A1,A2,…,An}
必然是关系 R的超键码。满足这样条件的关系就属于 BCNF。
也就是说,BCNF条件的含义是每一个非平凡依赖的左边必须包含超键码。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 23页分解成 BCNF模式的算法
如果关系模式不属于 BCNF,那么我们需要对原来的关系模式进行分解。分解的目的是保证分解后得到的子集都属于 BCNF,且分解后的数据依然如实地表示了原始关系中的数据。
模式分解的关键是使用合适的分解策略。一般地,分解成
BCNF模式的算法如下所示:
第一步,找到一个违背 BCNF的非平凡依赖,并且在该依赖的右边加上尽量多的属性。
第二步,把原始关系模式分解成两个属性重迭的关系模式,一个模式包含了违背 BCNF的所有属性,另一个模式包含了该依赖左边以及未包含在该依赖中的所有属性。
第三步,判断新关系模式是否满足 BCNF。如果不满足,继续进行分解;如果满足,则停止。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 24页函数依赖的投影
在分解关系模式时,我们需要确定新关系模式是否满足
BCNF条件。这种判断的前提是指导新关系模式中成立的函数依赖,这些函数依赖是原关系模式的函数依赖在新关系模式上的投影。下面,我们介绍一种找到新关系模式中函数依赖的方法。
假设把关系 R分解成关系 S和 T,F是 R中已知的函数依赖集。现在计算 S中成立的函数依赖。考虑包含于 S中的属性集的每个属性集 X,计算 X+。于是,满足下列条件的每个属性 B,函数依赖 X→B 在关系 S中成立:
B是 S的一个属性;
B属于 X+;
B不属于 X。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 25页第三范式
前面讲过在模式分解过程中,我们需要保证分解过程中的信息不能丢失,并且可以在重新连接之后所有的函数依赖都能保持不变,这时可以使关系模式符合 BCNF条件。但是,在某些情况下,虽然按照这种方法进行分解,但是当对得到的关系模式进行连接时,却不能保证原先所有的函数依赖都能得到保持。这时,关系模式就不应该继续进行分解了,该关系模式满足的范式称为第三范式。
第三范式的目的是放宽对 BCNF条件的限制。如果对于任何非平凡依赖 A1,A2,…,An→B,那么或 {A1,
A2,…,An}是关系 R的超键码,或 B是某个键码的组成部分。满足这样条件的关系就属于第三范式 (Third
Normal Form,3NF)。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 26页第二范式
相对而言,第二范式比 3NF条件更加宽松。在一个关系中,如果 {A1,A2,…,An}是关系 R的键码,B是关系中的任意非键码,那么非平凡依赖
A1,A2,…,An→B 都成立,则该关系模式属于第二范式 (Second Normal Form,2NF)。
根据定义,可以看到 2NF只是要求关系中的所有非键码属性都是由键码属性来决定,而不排除关系中存在的传递依赖情况。而 3NF则排除了关系中传递依赖存在的情况。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 27页主要内容
6.1 概述
6.2 函数依赖
6.3 关系模式的分解
6.4 关系模式的范式
6.5 多值依赖
6.6 范式之间的关系
6.7 数据库模式的实例
6.8 本章小结数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 28页
6.5 多值依赖
前面介绍了几种类型的关系范式,这些范式能消除关系模式设计中出现的诸如数据冗余等异常现象。
但是,这些范式还不能消除所有的数据冗余现象。
例如,某些关系模式已经满足了 BCNF的要求,
但是该关系实例依然存在着许多数据冗余现象。
为了消除这种数据异常现象,我们需要研究多值依赖,并且在此基础上提出一个新的关系模式范式,即第四范式。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 29页多值依赖的概念
多值依赖的含义是如果确定了关系 R的一个属性集的取值,
则其他某些特定属性的取值与该关系的所有其他属性的取值无关。
确切地说,如果限定关系 R的元组在属于 A的每个属性上取特定的值,结果属于 B的属性取值的集合与既不属于 A也不属于 B但属于 R的属性取值的集合无关,则称如下所示的多值依赖在关系 R中成立:
A1A2…An→→B1B2…Bm
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 30页多值依赖的推理规则
平凡依赖规则:在某个关系中,如果多值依赖A1A2…An→→B1B2…Bm 成立,则多值依赖
A1A2…An→→C1C2…Ck 也成立,其中,C是 B加上 A中的一个或多个属性。反之,我们也可以从 B中删除一些属于 A的属性,并推导出多值依赖 A1A2…An→→D1D2…Dr,其中,D是在 B中而不属于 A的属性。
传递规则:在某个关系中,如果多值依赖 A1A2…An→→B1B2…Bm
和 B1B2…Bm→→C1C2…Ck 成立,则多值依赖
A1A2…An→→C1C2…Ck 成立。
复制规则:在关系中,每一个函数依赖都是多值依赖,即如果
A1A2…An→B1B2…Bm 成立,则 A1A2…An→→B1B2…Bm 也成立。
互补规则:如果 A1A2…An→→B1B2…Bm 是关系 R的多值依赖,则
R也满足 A1A2…An→→C1C2…Ck,其中,C是不属于 A和 B的 R的所有其他属性。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 31页第四范式
如果把多值依赖用于新的关系分解算法中,那么像图 6-12中那些由多值依赖引起的冗余可以消除。
如果 B中的属性都不在 A中,且 A和 B并未包含 R中的所有属性,那么关系 R中的多值依赖 A1A2…An→→B1B2…Bm 就是非平凡的。下面将要介绍的第四范式,不但消除 BCNF违例,而且还将消除所有的非平凡多值依赖,最终消除由多值依赖引起的冗余。
如果 A1A2…An→→B1B2…Bm 是非平凡的多值依赖,且 {A1,
A2,…,An}是关系的超键码,那么该关系就属于第四范式 (Fourth
Normal Form,4NF)。
数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 32页主要内容
6.1 概述
6.2 函数依赖
6.3 关系模式的分解
6.4 关系模式的范式
6.5 多值依赖
6.6 范式之间的关系
6.7 数据库模式的实例
6.8 本章小结数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 33页
6.6 范式之间的关系数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 34页主要内容
6.1 概述
6.2 函数依赖
6.3 关系模式的分解
6.4 关系模式的范式
6.5 多值依赖
6.6 范式之间的关系
6.7 数据库模式的实例
6.8 本章小结数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 35页
6.7 数据库模式的实例
图书管理数据库模式
计算机产品信息管理数据库模式数据库系统原理与应用教程 (第二版 ) 第 6章 关系模式的规范化设计 第 36页主要内容
6.1 概述
6.2 函数依赖
6.3 关系模式的分解
6.4 关系模式的范式
6.5 多值依赖
6.6 范式之间的关系
6.7 数据库模式的实例
6.8 本章小结