目录
关系模式设计的优劣之分
在以往的学校数据库的例子中,我们都是为学生S、院系D、学生院系表SD、课程C、选课记录SC等分别建表。那么其实也有另一种建表方法,就是将所有的信息都综合在一张UN表中。为了比较两种关系模式设计,考虑如下操作:
- 插入一个学生的信息:
- 在分别建表中,只需要为S表增加一个元组;
- 在UN表中,缺失除学生信息外的数据,会导致插入异常。
- 修改一个学生的信息:
- 在分别建表中,只需修改S中的信息;
- 在UN表中,需要修改所有包含该学生的元组。
- 删除一个学生的信息:
- 在分别建表中,只需删除S和SD、SC中的信息;
- 在UN表中,需要删除所有包含该学生的元组。极端情况下,如果某课程只有该名同学选,则该课程的信息也会被连带删除。
总之,UN表数据冗余和操作开销都很大,我们认为这样的关系模式设计是不好的。因此,关系模式不是设计出来就行,还有优劣之分。类似UN的设计之所以不好,是由于其关系内部属性之间的约束关系过于复杂。因此,探究关系数据库设计理论,研究数据之间的依赖关系,就很重要了。
数据依赖的概念
数据依赖是一个关系内部属性值之间相互依赖又相互制约的关系。在第二章数据库关系模式的四元式形式化描述
R
(
U
,
D
,
D
o
m
,
F
)
R(U,D,Dom,F)
R(U,D,Dom,F)中,
F
F
F就是依赖关系的集合。
数据依赖有许多种类型,其中最重要的有两种:
- 函数依赖
- 多值依赖
函数依赖
函数依赖的定义
- 设 R ( U ) R(U) R(U)是属性集 U U U上的关系模式, X X X, Y Y Y是 U U U的子集,对于 R ( U ) R(U) R(U)的任意一个具体关系 r r r中的任意两个元组 t t t, s s s,如果满足若 t [ X ] = s [ X ] t[X]=s[X] t[X]=s[X]则 t [ Y ] = s [ Y ] t[Y]=s[Y] t[Y]=s[Y],则称 X X X函数确定 Y Y Y或 Y Y Y函数依赖于 X X X。记作 X → Y X\rightarrow Y X→Y。函数依赖英文为Functional Dependency,简写FD。
- 简单一点的说法:对于 X X X的每一个具体值, Y Y Y有唯一的值与之对应。则称 X X X函数确定 Y Y Y或 Y Y Y函数依赖于 X X X。
需要说明的是,如果关系 r r r中没有两个 t [ X ] = s [ X ] t[X]=s[X] t[X]=s[X]相等,也不能说 Y Y Y就一定不函数依赖于 X X X。这是因为函数依赖是语义范畴的概念,不能形式化证明一个函数依赖成立,只能通过语义确定。
注意到总有 X X X的子集函数依赖于 X X X,但这类依赖的研究意义不大。
函数依赖的术语
- 平凡和非平凡的函数依赖
对于函数依赖 X → Y X\rightarrow Y X→Y,若 Y ⊆ X Y\subseteq X Y⊆X ,则称 X → Y X\rightarrow Y X→Y是平凡的函数依赖;若 Y ⊈ X Y\not\subseteq X Y⊆X,则称 X → Y X\rightarrow Y X→Y是非平凡的函数依赖。 - 决定因素
对于函数依赖 X → Y X\rightarrow Y X→Y, X X X叫做决定因素。
函数依赖与属性间的联系类型
- X X X与 Y Y Y是1:1联系,如学号与身份证号,二者是相互函数决定/依赖的。
- X X X与 Y Y Y是1:m联系,如系号与学号,有 Y → X Y\rightarrow X Y→X。
- X X X与 Y Y Y是m:n联系,如学号与课程名,则 X X X, Y Y Y之间不存在函数依赖关系。
函数依赖的分类
- 完全函数依赖与部分函数依赖:
在 R ( U ) R(U) R(U)中,如果 X → Y X\rightarrow Y X→Y,且对任意 X X X的真子集 X ′ X' X′,都有 X ′ ↛ Y X' \nrightarrow Y X′↛Y,则称 Y Y Y对 X X X完全函数依赖,记作 X → f Y X\xrightarrow[]{f}Y XfY,否则称为部分函数依赖,记作 X → p Y X\xrightarrow[]{p}Y XpY。 - 传递函数依赖:
在 R ( U ) R(U) R(U)中,如果 X → Y X\rightarrow Y X→Y, Y → Z Y\rightarrow Z Y→Z,且 Y ↛ X Y\nrightarrow X Y↛X,则称 Z Z Z对 X X X传递函数依赖,记作- 注:如果 X → Y X\rightarrow Y X→Y, Y → Z Y\rightarrow Z Y→Z,一定有 X → Z X\rightarrow Z X→Z,但不一定是传递函数依赖。
码的再定义
有了函数依赖的关系后,我们可以重新定义码:
如果
R
(
U
,
F
)
R(U,F)
R(U,F)中的属性或属性组合
K
K
K,
K
→
f
U
K\xrightarrow[]{f} U
KfU,则称
K
K
K为
R
R
R的候选码。若候选码多于一个,则选定其中的一个作为主码。
函数依赖的Armstrong公理系统
F F F逻辑蕴含 X → Y X\rightarrow Y X→Y的定义
如果函数依赖 X → Y X\rightarrow Y X→Y能从 R < U , F > R<U,F> R<U,F>的 F F F中的函数依赖推出,则称 F F F逻辑蕴含 X → Y X\rightarrow Y X→Y。显然, F F F逻辑蕴含 F F F中的所有FD。
F F F的闭包 F + F^+ F+的定义
在关系模式 R < U , F > R<U, F> R<U,F>中,为 F F F所逻辑蕴涵的函数依赖的全体称作 F F F的闭包,记作 F + F^+ F+。
定理: X → Y X\rightarrow Y X→Y能够由 F F F根据Armstrong公理导出 ⟺ \iff ⟺ Y ⊆ X F + Y\subseteq X_F^+ Y⊆XF+。
属性集 X X X关于F的闭包 X F + X_F^+ XF+的定义
在
X
X
X中,
X
⊆
U
X\subseteq U
X⊆U,定义:
X
F
+
=
{
∪
A
∣
X
→
A
能由
F
根据
A
r
m
s
t
r
o
n
g
公理系统推出
}
\small X_F^+=\{\cup A|X\rightarrow A 能由F根据Armstrong公理系统推出\}
XF+={∪A∣X→A能由F根据Armstrong公理系统推出}
注:有时候不太区分
A
A
A是一个元素还是集合,有的地方也这样写:
X
F
+
=
{
A
∣
X
→
A
能由
F
根据
A
r
m
s
t
r
o
n
g
公理系统推出
}
\small X_F^+=\{A|X\rightarrow A 能由F根据Armstrong公理系统推出\}
XF+={A∣X→A能由F根据Armstrong公理系统推出}
算法:求 X F + X_F^+ XF+
Input:属性集 X X X,依赖集合 F F F
Output: X F + X_F^+ XF+
X F + X_F^+ XF+:= X X X
do
for A ⊆ X F + A\subseteq X_F^+ A⊆XF+ do
if A → B A\rightarrow B A→B
then X F + X_F^+ XF+:= X F + ∪ B X_F^+\cup B XF+∪B
until( X F + X_F^+ XF+不再改变)
Armstrong公理系统的三条公理
对于关系 R < U , F > R<U,F> R<U,F>,有如下三条规则:
- 自反律:若 X ⊆ Y ⊆ U X \subseteq Y \subseteq U X⊆Y⊆U,一定有 F F F逻辑蕴含 Y → X Y\rightarrow X Y→X。即之前提到的平凡函数依赖。
- 增广律:若 F F F逻辑蕴含 X → Y X\rightarrow Y X→Y,且 Z ⊆ U Z\subseteq U Z⊆U,则一定有 X Z → Y Z XZ\rightarrow YZ XZ→YZ。(这里 X Z XZ XZ和 Y Z YZ YZ分别是 X ∪ Z X\cup Z X∪Z和 Y ∪ Z Y\cup Z Y∪Z的简写)
- 传递性:若 F F F逻辑蕴含 X → Y X\rightarrow Y X→Y和 Y → Z Y\rightarrow Z Y→Z,则一定有 X → Z X\rightarrow Z X→Z。
可以证明以上三条显然成立。
Armstrong公理系统三条推理规则
由以上三条公理还可以得到如下三条推理规则:
- 合并规则:若 X → Y X\rightarrow Y X→Y, X → Z X\rightarrow Z X→Z,有 X → Y Z X\rightarrow YZ X→YZ
- 分解规则:若 X → Y X\rightarrow Y X→Y, Z ⊆ Y Z \subseteq Y Z⊆Y,有 X → Z X\rightarrow Z X→Z
- 伪传递规则:若 X → Y X\rightarrow Y X→Y, W Y → Z WY\rightarrow Z WY→Z,有 W X → Z WX\rightarrow Z WX→Z。意思是添了新的条件,就能推出新的内容。
合并规则和分解规则实质上可以合并为如下规则:
- X → Y 1 Y 2 … Y n ⟺ X → Y i ( i = 1 , 2 … n ) X\rightarrow Y_1Y_2\dots Y_n \iff X\rightarrow Y_i(i=1,2\dots n) X→Y1Y2…Yn⟺X→Yi(i=1,2…n)
Armstrong公理系统的有效性与完备性
- 有效性:指由 F F F出发根据Armstrong公理推导出来的每个函数依赖一定在 F F F所蕴含的函数依赖的全体之中。
- 完备性: F F F所蕴含的函数依赖的全体中的每一个函数依赖,必定可以由 F F F根据Armstrong公理导出
函数依赖集的等价与覆盖
函数依赖集 F F F, G G G,若 F + = G + F^+=G^+ F+=G+,则称 F F F与 G G G等价,或者说 F F F覆盖 G G G且 G G G覆盖 F F F。
引理: F + = G + ⟺ F ⊆ G , G ⊆ F F^+=G^+ \iff F\subseteq G, G\subseteq F F+=G+⟺F⊆G,G⊆F
F F F的最小依赖集
F F F的最小依赖集,或称极小依赖集,或称最小覆盖,定义为满足以下三个条件的依赖集:
- 右部为单属性:对于 F F F中的任意依赖 X → A X\rightarrow A X→A, A A A一定是单属性。
- 左部无多余属性: F F F不存在 X → A X\rightarrow A X→A, X X X有真子集 X ′ ⊂ X X'\subset X X′⊂X,使 ( F − { X → A } ) ∪ { X ′ → A } (F-\{X\rightarrow A\})\cup \{X'\rightarrow A\} (F−{X→A})∪{X′→A}与 F F F等价。
- 无多余FD: F F F不存在 X → A X\rightarrow A X→A,使 F − { X → A } F-\{X\rightarrow A\} F−{X→A}与 F F F等价。
算法:求 F F F的最小依赖集
Input: 函数依赖集 F F F
Output: 极小化后的 F F FStep1:右部单属性化
for F D i = X → Y ∈ F FD_i=X\rightarrow Y \in F FDi=X→Y∈F do
if Y = A i A 2 . . . A k Y=A_iA_2...A_k Y=AiA2...Ak
then F F F:= ( F − { F D i } ) ∪ { X → A 1 , X → A 2 , . . . , X → A k } (F-\{FD_i\})\cup \{X\rightarrow A_1, X\rightarrow A_2,...,X\rightarrow A_k\} (F−{FDi})∪{X→A1,X→A2,...,X→Ak}Step2:消除左部多余属性
for F D i = X → A ∈ F FD_i=X\rightarrow A \in F FDi=X→A∈F do
if X = B i B 2 . . . B k X=B_iB_2...B_k X=BiB2...Bk then
for B i ⊆ X B_i\subseteq X Bi⊆X do
if A ∈ ( X − B i ) F + A\in (X-B_i)_F^+ A∈(X−Bi)F+
then F F F:= ( F − { F D i } ) ∪ { ( X − B i ) → Y } (F-\{FD_i\})\cup \{(X-B_i)\rightarrow Y\} (F−{FDi})∪{(X−Bi)→Y}Step3:消除多余FD
do
for F D i = X → A ∈ F FD_i=X\rightarrow A \in F FDi=X→A∈F do
if A ∈ X F − { F D i } + A\in X_{F-\{FD_i\}}^+ A∈XF−{FDi}+
then F F F:= F − { F D i } F-\{FD_i\} F−{FDi}
until F F F不再改变注:不同的最小化顺序,所得的最小依赖集可能不一样。最小依赖集可能不是唯一的。