针对一个具体的问题,应该如何构造一个适合于他的数据库模式,即应该构造几个关系模式,每个关系有哪几个属性组成等。
由此形成了关系数据库的规范化理论。
一个关系模式应当是一个五元组:
R ( U , D , D O M , F ) R(U, D, DOM, F) R(U,D,DOM,F)
作为一个二维表,关系要符合一个最基本的条件:每一个分量必须是一个不可分的数据项,满足了这个条件的关系模式就属于第一范式(1NF)。
数据依赖的概念:
数据依赖是一个关系内部属性与属性之间的一种约束关系,这种约束关系是通过属性间值的相等于否体现出来的数据间的的相关联系。
所有类型的数据依赖中,最重要的是函数依赖(Functional Dependency,FD)和多值依赖(Multi-Valued Dependency,MVD)。
例如,确定了学生的学号,就能知道学生的名字,类似于数学上的 S n a m e = f ( S n o ) Sname = f(Sno) Sname=f(Sno)的函数关系。
设计的不好的关系模式可能会存在以下问题:
本节首先讨论如何根据属性间依赖情况来判定关系是否具有某些不适合的性质。
通常,按属性间依赖情况来区分关系规范化程度为第一范式、第二范式、第三范式、第四范式等……
定义6.1:
设 R ( U ) R(U) R(U)是属性集U上的关系模式,X,Y是U的子集,若对于 R ( U ) R(U) R(U)的任意一个可能的关系r,r中不可能存在两个元组在X属性集上相等而在Y属性集上不等,则称**X函数确定Y,或者Y函数依赖于X,记作 X → Y X \rightarrow Y X→Y。
函数依赖和别的数据依赖一样是语义范畴的概念,只能根据语义来确定一个函数依赖。
例如: 姓 名 → 年 龄 姓名 \rightarrow 年龄 姓名→年龄这个函数依赖只在没有同名的人的条件下成立。
下面介绍一些术语和记号
定义6.2
在 R ( U ) R(U) R(U)中,如果 X → Y X \rightarrow Y X→Y,并且对于X的任意一个真子集 X ′ X' X′都有 X ′ ↛ Y X' \nrightarrow Y X′↛Y,则称Y对X完全函数依赖,记为 X → F Y X \rightarrow^{F} Y X→FY,否则,则称Y对X部分函数依赖,记作 X → P Y X \rightarrow^{P} Y X→PY。
定义6.3
在 R ( U ) R(U) R(U)中,如果 X → Y , Y ⊈ X , Y ↛ X , Y → Z , Z ⊈ Y X \rightarrow Y, Y \nsubseteq X, Y \nrightarrow X, Y \rightarrow Z, Z \nsubseteq Y X→Y,Y⊈X,Y↛X,Y→Z,Z⊈Y,则称Z对X有传递函数依赖,记作 X → 传 递 Y X \rightarrow^{传递} Y X→传递Y。
定义6.4
设K为 R < U , F > R<U,F> R<U,F>中的属性或属性组和,如果 K → F U K \rightarrow^{F} U K→FU,则称K为R的候选码。
一般的,如果 K → U K \rightarrow U K→U,则K成为超码,候选码是一类特殊的超码,即:候选码的超集一定是超码,候选码的任何真子集不一定是超码(作者就非得写得这么绕)。
如果候选码多于一个,则选定其中一个作为主码。
包含在任何一个候选码中的属性称为主属性,其余的属性称为非主属性、非码属性,如果整个属性组是码,称为全码。
定义6.5:
关系模式R中的属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外部码,简称外码。
关系数据库中的关系是要满足一定的要求的,满足不同程度要求的为不同的范式。
满足最低要求的称为第一范式,简称1NF;在第一范式中满足进一步要求的称为第二范式,以此类推。
一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫做规范化。
定义6.6:
如果 R ∈ 1 N F R \in 1NF R∈1NF,并且每一个非主属性完全依赖于任何一个候选码,则 R ∈ 2 N F R \in 2NF R∈2NF。
如果一个关系模式 R R R不属于 2 N F 2NF 2NF,会存在以下几点问题:
定义6.7:
设关系模式 R < U , F > ∈ 1 N F R<U, F> \in 1NF R<U,F>∈1NF,若 R R R中不存在这样的码 X X X,属性组 Y Y Y以及非主属性 Z Z Z( Z ⊈ Y Z \nsubseteq Y Z⊈Y),使得 X → Y , Y → Z X \rightarrow Y, Y \rightarrow Z X→Y,Y→Z并且 Y ↛ Z Y \nrightarrow Z Y↛Z,则称 R < U , F > ∈ 3 N F R<U, F> \in 3NF R<U,F>∈3NF。
也就是说,如果 R ∈ 3 N F R \in 3NF R∈3NF,则每一个非主属性既不传递依赖于码,也不部分依赖于码;也就是是说,如果 R ∈ 3 N F R \in 3NF R∈3NF,则必有 R ∈ 2 N F R \in 2NF R∈2NF。
定义6.8:
关系模式 R < U , F > ∈ 1 N F R<U, F> \in 1NF R<U,F>∈1NF,如果当 X → Y , Y ⊈ X X \rightarrow Y, Y \nsubseteq X X→Y,Y⊈X时, X X X必包含码,则 R < U , F > ∈ B C N F R<U, F> \in BCNF R<U,F>∈BCNF。
每一个满足BCNF的关系模式都满足以下性质:
定义6.9:
设 R ( U ) R(U) R(U)是属性集 U U U上的一个关系模式, Z , Y , Z ⊂ U 并 且 Z = U − X − Y Z, Y, Z \subset U 并且 Z = U - X - Y Z,Y,Z⊂U并且Z=U−X−Y。关系模式中,多值依赖 X → → Y X \rightarrow \rightarrow Y X→→Y成立,当且仅当对 R ( U ) R(U) R(U)的任一关系 r r r,给定一对 ( x , z ) (x, z) (x,z),有一组 Y Y Y的值,这组值这组值仅仅决定于 x x x的值而与 z z z的值无关。(书本定义写的贼乱,看书本的样例来理解)
如果 X → → Y X \rightarrow \rightarrow Y X→→Y并且 Z = ∅ Z = \varnothing Z=∅,则称 X → → Y X \rightarrow \rightarrow Y X→→Y为平凡的多值依赖。
多值依赖的性质:
多值依赖具有完备性
如果 X → → Y X \rightarrow \rightarrow Y X→→Y, 则 X → → Z X \rightarrow \rightarrow Z X→→Z,其中 Z = U − X − Y Z = U - X - Y Z=U−X−Y.
多值依赖具有传递性
如果 X → → Y , Y → → Z X \rightarrow \rightarrow Y, Y \rightarrow \rightarrow Z X→→Y,Y→→Z,则 X → → Z − Y X \rightarrow \rightarrow Z - Y X→→Z−Y。
函数依赖可以看作是多值依赖的特殊情况
如果 X → Y X \rightarrow Y X→Y,则 X → → Y X \rightarrow \rightarrow Y X→→Y。
i f    X → → Y , X → → Z , t h e n    X → → Y ∪ Z if \; X \rightarrow \rightarrow Y, X \rightarrow \rightarrow Z, then \; X \rightarrow \rightarrow Y \cup Z ifX→→Y,X→→Z,thenX→→Y∪Z
i f    X → → Y , X → → Z , t h e n    X → → Y ∩ Z if \; X \rightarrow \rightarrow Y, X \rightarrow \rightarrow Z, then \; X \rightarrow \rightarrow Y \cap Z ifX→→Y,X→→Z,thenX→→Y∩Z
i f    X → → Y , X → → Z , t h e n    X → → Y − Z , X → → Z − Y if \; X \rightarrow \rightarrow Y, X \rightarrow \rightarrow Z, then \; X \rightarrow \rightarrow Y - Z, X \rightarrow \rightarrow Z - Y ifX→→Y,X→→Z,thenX→→Y−Z,X→→Z−Y
多值依赖与函数依赖的两个基本区别
多值依赖的有效性与属性集的范围有关
如果 X → → Y X \rightarrow \rightarrow Y X→→Y在 U U U上成立,则在 W ( X Y ⊆ W ) W(XY \subseteq W) W(XY⊆W)上也成立,反之不然(因为多值依赖涉及U中剩余属性Z)。
如果有函数依赖 X → Y X \rightarrow Y X→Y在 U U U上成立,则对于任意的 Y ′ ⊆ U Y' \subseteq U Y′⊆U,都有 X → Y ′ X \rightarrow Y' X→Y′成立,而对于多值依赖 X → → Y X \rightarrow \rightarrow Y X→→Y,不一定有 X → → Y ′ X \rightarrow \rightarrow Y' X→→Y′成立。
定义6.10:
对于关系模式 R < U , F > ∈ 1 N F R<U, F> \in 1NF R<U,F>∈1NF,如果对于 R R R的每一个非平凡多值依赖 X → → Y ( Y ⊈ X ) X \rightarrow \rightarrow Y(Y \nsubseteq X) X→→Y(Y⊈X), X X X都含有码,则称 R < U , F > ∈ 4 N F R<U, F> \in 4NF R<U,F>∈4NF。
4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖,因为如果对于每一个非平凡的多值依赖, X → → Y X \rightarrow \rightarrow Y X→→Y,X都含有候选码,就相当于 X → Y X \rightarrow Y X→Y。
显然,如果一个关系模式为4NF,则其必为BCNF。
规范化的基本思想是逐步消除数据依赖中不合适的部分;
所谓的规范化实际上是概念的单一化;
关系模式的规范化过程是通过对关系模式的分解来实现的,即把低一级的关系模式分解为若干个高一级的关系模式。
下面首先讨论函数依赖的一个完备而有效的公理系统:Armstrong公理系统。
定义6.11:
对于满足一组函数依赖 F F F的关系模式 R < U , F > R<U, F> R<U,F>,其中任何一个关系 r r r函数依赖 X → Y X \rightarrow Y X→Y都成立,则称 F F F逻辑蕴含 X → Y X \rightarrow Y X→Y。
Armstrong公理系统:
设总体属性集为 U U U, F F F是 U U U上的一组函数依赖,于是有关系模式 R < U , F > R<U, F> R<U,F>,对于这个关系模式有以下推理规则:
A1自反律
如果 X ⊆ Y ⊆ U X \subseteq Y \subseteq U X⊆Y⊆U,则 X → Y X \rightarrow Y X→Y为 F F F蕴涵。
A2增广律
如果 X → Y X \rightarrow Y X→Y为 F F F蕴涵,且 Z ⊆ U Z \subseteq U Z⊆U,则 X Z → Y Z XZ \rightarrow YZ XZ→YZ。
A3传递律
如果 X → Y , Y → Z X \rightarrow Y, Y \rightarrow Z X→Y,Y→Z为 F F F蕴涵,则 X → Z X \rightarrow Z X→Z也为 F F F蕴涵。
定理6.1:
Armstrong推理规则是正确的。
根据A1,A2,A3三条规则,还可以推理出一下三条规则:
合并规则:
如果 X → Y , X → Z X \rightarrow Y, X \rightarrow Z X→Y,X→Z,则 X → Y Z X \rightarrow YZ X→YZ
伪传递规则:
如果 X → Y , Y W → Z X \rightarrow Y, YW \rightarrow Z X→Y,YW→Z,则 W X → Z WX \rightarrow Z WX→Z
分解规则:
如果 X → Z , Z ⊆ Y X \rightarrow Z, Z \subseteq Y X→Z,Z⊆Y,则 X → Z X \rightarrow Z X→Z
引理6.1:
X → A 1 A 2 A 3 ⋯ A k X \rightarrow A_1 A_2 A_3 \cdots A_k X→A1A2A3⋯Ak的充分必要条件是 X → A i ( i = 1 , 2 , ⋯   , k ) X \rightarrow A_i(i = 1, 2, \cdots, k) X→Ai(i=1,2,⋯,k)
定义6.12:
关系模式 R < U , F > R<U,F> R<U,F>中为 F F F蕴涵的函数依赖的全体叫做 F F F的闭包,记为 F + F^+ F+。
Armstrong公理是有效的、完备的:
有效性:
由 F F F出发,根据Armstrong公理推导出的每一个函数依赖一定在 F + F^+ F+中。
完备性:
F + F^+ F+中的每一个函数依赖,一定可以由 F F F出发根据Armstrong公理推导出来。
定义6.13
设 F F F为属性集 U U U上的一组函数依赖,且 X , Y ⊆ U , X F + = { A ∣ X → A 能 由 F 根 据 A r m s t r o n g 公 理 推 导 出 来 } X,Y \subseteq U, X_F^+ = \{ A | X \rightarrow A 能由F根据Armstrong公理推导出来 \} X,Y⊆U,XF+={A∣X→A能由F根据Armstrong公理推导出来},则 X F + X_F^+ XF+称为属性集 X X X关于函数依赖 F F F的闭包。
引理6.2:
F F F为属性集 U U U上的一组函数依赖, X , Y ⊆ U X,Y \subseteq U X,Y⊆U, X → Y X \rightarrow Y X→Y能由 F F F根据Armstrong公理推导出来的充分必要条件是 Y ⊆ X F + Y \subseteq X_F^+ Y⊆XF+。
算法6.1 求属性集 X , X ⊆ U X, X \subseteq U X,X⊆U在 U U U上关于函数依赖集 F F F的闭包 X F + X_F^+ XF+:
输 入 : X 、 F 输入: X、F 输入:X、F
输 出 : X F + 输出: X_F^+ 输出:XF+
步 骤 : 步骤: 步骤:
令 X ( 0 ) = X , i = 0 令 X^{(0)} = X, i = 0 令X(0)=X,i=0
求 解 属 性 集 B , B = { A ∣ 存 在 属 性 集 V , W , 满 足 V → W ∈ F 且 V ⊆ X ( i ) 且 A ∈ W } 求解属性集B,B = \{ A | 存在属性集V,W,满足V \rightarrow W \in F 且 V \subseteq X^{(i)} 且 A \in W \} 求解属性集B,B={A∣存在属性集V,W,满足V→W∈F且V⊆X(i)且A∈W}
X i + 1 = X ( i ) ∪ B X^{i+1} = X^{(i)} \cup B Xi+1=X(i)∪B
如 果 X ( i + 1 ) = X ( i ) 或 X ( i ) = U , 则 X F + 即 为 X ( i ) , 算 法 终 止 如果 X^{(i + 1)} = X^{(i)} 或 X^{(i)} = U,则X_F^+即为X^{(i)},算法终止 如果X(i+1)=X(i)或X(i)=U,则XF+即为X(i),算法终止
否 则 , i = i + 1 , 回 到 第 二 步 执 行 否则,i = i + 1,回到第二步执行 否则,i=i+1,回到第二步执行
算法的严谨描述比较抽象,可以看书上的样例辅助理解
于是,判断 X → Y X \rightarrow Y X→Y能否由 F F F根据Armstrong公理推导出来,转化为了求解 X F + X_F^+ XF+,并判断 Y Y Y是否为 X F + X_F^+ XF+的子集。
定义6.14:
如果 G + = F + G^+=F^+ G+=F+,则称函数依赖集 F F F覆盖 G G G,或者 F , G F,G F,G等价。
引理6.3:
F + = G + F^+ = G^+ F+=G+的充分必要条件是 F ⊆ G + 或 G ⊆ F + F \subseteq G^+ 或 G \subseteq F^+ F⊆G+或G⊆F+。
定义6.15:
如果函数依赖集 F F F满足以下条件,则称 F F F为一个极小函数依赖集或者最小依赖集或者最小覆盖。
(3)的含义是对于 F F F中的每一个函数依赖,左部尽可能简。
定理6.3:
每一个函数依赖集 F F F都等价于一个极小函数依赖集 F m F_m Fm,此时称 F m F_m Fm为 F F F的最小依赖集。
求解最小依赖集的方法:
应当指出, F F F的最小依赖集 F m F_m Fm并不是唯一的,他与上述过程中的处置顺序有关。