一、函数依赖
- 定义:设 R ( U ) R(U) R(U)是属性集合 U = { A 1 , A 2 , . . . , A n } U = \{A_1, A_2, ..., A_n\} U={A1,A2,...,An}上的一个关系模式, X , Y X, Y X,Y是 U U U上的两个子集,若对 R ( U ) R(U) R(U)的任意一个可能得关系 r r r, r r r中不可能有两个元组满足在 X X X中的属性值相等而在 Y Y Y中的属性值不等,则称“ X X X函数决定 Y Y Y”或“ Y Y Y函数依赖于 X X X”,记为 X → Y X \rightarrow Y X→Y。
简单来说,函数依赖就是两个属性(或属性组)之间取值的关系。 X → Y X \rightarrow Y X→Y,要求当 X X X中属性相同时, Y Y Y中对应的属性值也相同,即 ∀ t , s ∈ R ( U ) , t [ X ] = s [ X ] → t [ Y ] = s [ Y ] \forall t, s \in R(U), t[X] = s[X] \rightarrow t[Y] = s[Y] ∀t,s∈R(U),t[X]=s[X]→t[Y]=s[Y]。显然,若 X X X中元组的属性值互不相同, X → Y X \rightarrow Y X→Y一定成立。
示例: U = { 学 号 , 姓 名 , 班 号 , 班 长 , 课 号 , 成 绩 } U = \{学号,姓名,班号,班长,课号,成绩\} U={学号,姓名,班号,班长,课号,成绩}
函数依赖有:
(1) 学号 → \rightarrow → {姓名,班号,班长}
(2) 班号 → \rightarrow → {班长}
(3) {学号,课号} → \rightarrow → 成绩
设计关系模式时,除了要给出属性全集外,还需给出数据依赖集合。
- 问题示例
上表存在的函数依赖有: A → B , B → C A \rightarrow B, B \rightarrow C A→B,B→C
上表存在的函数依赖有: A → C , D → B A \rightarrow C, D \rightarrow B A→C,D→B
- 函数依赖的特性
对 X → Y X \rightarrow Y X→Y,但 Y ⊄ X Y \not \subset X Y⊂X,则称 X → Y X \rightarrow Y X→Y为非平凡的函数依赖.
若 X → Y X \rightarrow Y X→Y,则任意两个元组,若 X X X上值相等,则 Y Y Y上值必然相等,称 X X X为决定因素.
若 X → Y X \rightarrow Y X→Y, Y → X Y \rightarrow X Y→X,则记作 X ↔ Y X \leftrightarrow Y X↔Y.
若 Y Y Y不函数依赖于 X X X,则记为 X ↛ Y X \not \rightarrow Y X→Y.
如果某一关系 r r r的某属性集 X X X, r r r中根本没有 X X X上相等的两个元组存在,则 X → Y X \rightarrow Y X→Y恒成立.
二、部分或完全函数依赖
- 定义:在 R ( U ) R(U) R(U)中,若 X → Y X \rightarrow Y X→Y并且对于 X X X的任何真子集 X ′ X^\prime X′都有 X ′ ↛ Y X^\prime \not \rightarrow Y X′→Y,则称 Y Y Y完全函数依赖于 X X X,记为 X ⟶ f Y X \stackrel{f}\longrightarrow Y X⟶fY,否则称 Y Y Y部分函数依赖于 X X X,记为 X ⟶ p Y X \stackrel{p}\longrightarrow Y X⟶pY。
示例: U = { 学 号 , 姓 名 , 年 龄 , 课 号 , 成 绩 } U = \{学号,姓名,年龄,课号,成绩\} U={学号,姓名,年龄,课号,成绩}
函数依赖有:
(1) {学号,课号} ⟶ f U \stackrel{f}\longrightarrow U ⟶fU(因为该属性集是候选键)
(2) {学号,课号} ⟶ p \stackrel{p}\longrightarrow ⟶p姓名(因为学号就可以确定姓名)
(3) {学号,课号} ⟶ f \stackrel{f}\longrightarrow ⟶f成绩
部分依赖存在着非受控冗余。
三、传递函数依赖
- 定义:在 R ( U ) R(U) R(U)中,若 X → Y , Y → Z X \rightarrow Y, Y \rightarrow Z X→Y,Y→Z且 Y ⊄ X , Z ⊄ Y , Z ⊄ X , Y ↛ X Y \not \subset X, Z \not \subset Y, Z \not \subset X, Y \not \rightarrow X Y⊂X,Z⊂Y,Z⊂X,Y→X,则称 Z Z Z传递函数依赖于 X X X。
示例: U = { 学 号 , 班 号 , 班 长 } U = \{学号,班号,班长\} U={学号,班号,班长}
函数依赖有:学号 → \rightarrow → 班号;班号 → \rightarrow →班长
可以推出:学号 → \rightarrow →班长,“班长”是传递依赖于“学号”的。
传递依赖存在着非受控冗余。
四、函数依赖的相关概念
1. 候选键
- 定义:设 K K K为 R ( U ) R(U) R(U)中的属性或属性组合,若 K ⟶ f U K \stackrel{f}\longrightarrow U K⟶fU,则称 K K K为 R ( U ) R(U) R(U)上的候选键。
- 特性:候选键满足唯一性和最小性。因为候选键能唯一决定关系 R R R,且不可再分。
- 几点说明:
关系的候选键不只一个,可任选一候选键作为 R R R的主键。
包含在任一候选键中的属性称为主属性,不包含在任何候选键中的属性称为非主属性。
若 K K K是 R R R的一个候选键, K ⊂ S K \subset S K⊂S,则称 S S S为 R R R的一个超键。
- 三种求候选键的方法:
(1) 画出关系图,找无入度的属性。
(2) 一个个地求属性闭包
(3) step1. 从给出的函数依赖集中分别找出左边有右边没有的属性(记为L),右边有左边没有的属性(记为R),左右都没有的属性(记为N),左右都有的属性(记为LR);step2. 候选键中一定包含L和N,将它们写在一起;step3. 从LR中逐一拿出属性加入第二步得到的属性集里,求属性闭包,能确定全集的那些属性组就是候选键。
2.外来键
- 定义:若 R ( U ) R(U) R(U)中的属性或属性组合 X X X并非 R R R的候选键,但 X X X却是另一关系的候选键,则称 X X X为 R R R的外来键,简称外键。
3.逻辑蕴涵
- 设 F F F是关系模式 R ( U ) R(U) R(U)中的一个函数依赖集合, X , Y X, Y X,Y是 R R R的属性子集,如果从 F F F中的函数依赖能够推导出 X → Y X \rightarrow Y X→Y,则称 F F F逻辑蕴涵 X → Y X \rightarrow Y X→Y,或 X → Y X \rightarrow Y X→Y是 F F F的逻辑蕴涵。记作 F ⊨ X → Y F \vDash X \rightarrow Y F⊨X→Y。
- 说明:
若满足 F F F的每个关系(table)均满足 X → Y X \rightarrow Y X→Y,则说明 F F F逻辑蕴涵 X → Y X \rightarrow Y X→Y。
4. 闭包
- 定义:被 F F F逻辑蕴涵的所有函数依赖集合称为 F F F的闭包,记作 F + F^+ F+。
- 说明:
若 F + = F F^+ = F F+=F,则说 F F F是一个全函数依赖族(函数依赖完备集)。
- 示例:设 R = A B C , F = { A → B , B → C } R = ABC, F = \{A \rightarrow B, B \rightarrow C\} R=ABC,F={A→B,B→C},则 F + F^+ F+的组成如下,即由如下形式的 X → Y X \rightarrow Y X→Y构成:
(1) X X X包含 A A A,而 Y Y Y任意,如 A B C → A B , A → C , . . . ABC \rightarrow AB, A \rightarrow C, ... ABC→AB,A→C,...
(2) X X X包含 B B B但不含 A A A且 Y Y Y不含 A A A,如 B C → B , B → ∅ , . . . BC \rightarrow B, B \rightarrow \emptyset, ... BC→B,B→∅,...
(3) X → Y X \rightarrow Y X→Y是 C → C C \rightarrow C C→C或 C → ∅ C \rightarrow \emptyset C→∅
显然对于一个显性的函数依赖集,其中隐含的函数依赖是非常多的,这里就有了“小集合,大闭包”的说法。而且以上的求法得到的函数依赖集中包含了平凡的函数依赖。
- 求 F + F^+ F+的技巧:先求出 F m i n F_{min} Fmin,可以简化求解过程。这里介绍 F m i n F_{min} Fmin的求法:
对函数依赖 X → Y X \rightarrow Y X→Y,先将 Y Y Y分解化到最简,使用下面的公理 → \rightarrow → 分解律;再将 X X X分解到最简,这里用暴力法,逐一尝试,将分解出来的属性求属性闭包,看能不能推出右边;删除一些函数依赖,判断能否删除的标准:剩余的其他函数关系可以推出该关系。
五、函数依赖的Armstrong公理
- 设 R ( U ) R(U) R(U)是属性集 U = { A 1 , A 2 , . . . , A n } U = \{A_1, A_2, ..., A_n\} U={A1,A2,...,An}上的一个关系模式, F F F为 R ( U ) R(U) R(U)的一组函数依赖,记为 R ( U , F ) R(U, F) R(U,F),有如下规则成立:
[A1] 自反律:若 Y ⊆ X ⊆ U Y \subseteq X \subseteq U Y⊆X⊆U,则 X → Y X \rightarrow Y X→Y被 F F F逻辑蕴涵。
[A2] 增广律:若 X → Y ∈ F X \rightarrow Y \in F X→Y∈F,且 Z ⊆ U Z \subseteq U Z⊆U,则 X Z → Y Z XZ \rightarrow YZ XZ→YZ被 F F F逻辑蕴涵。
[A3] 传递律:若 X → Y ∈ F X \rightarrow Y \in F X→Y∈F,且 Y → Z Y \rightarrow Z Y→Z,则 X → Z X \rightarrow Z X→Z被 F F F逻辑蕴涵。
-
公理的作用是由已知的函数依赖推导出隐含的函数依赖。
-
由Armstrong’s Axiom可推出如下结论:
合并律:若 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且 W Y → Z WY \rightarrow Z WY→Z,则 X W → Z XW \rightarrow Z XW→Z。
分解律:若 X → Y X \rightarrow Y X→Y且 Z ⊆ Y Z \subseteq Y Z⊆Y,则 X → Z X \rightarrow Z X→Z。
六、属性(集)闭包
- 对 R ( U , F ) R(U, F) R(U,F), X ⊆ U X \subseteq U X⊆U, U = { A 1 , A 2 , . . . , A n } U = \{A_1, A_2, ..., A_n\} U={A1,A2,...,An},令: X F + = { A i ∣ 用 A r m s t r o n g A x i o m A 1 , A 2 , A 3 可 以 从 F 导 出 X → A i } X^+_F = \{A_i | 用Armstrong Axiom A1, A2, A3可以从F导出X \rightarrow A_i\} XF+={Ai∣用ArmstrongAxiomA1,A2,A3可以从F导出X→Ai},称 X F + X^+_F XF+为 X X X关于 F F F的属性集闭包。注:显然 X ⊆ X F + X \subseteq X^+_F X⊆XF+。
属性闭包包含的是由该属性通过函数依赖集可以推导出来的单一属性的集合。
- 引理
X → Y X \rightarrow Y X→Y可从 F F F由Armstrong Axiom导出,当且仅当 Y ⊆ X F + Y \subseteq X^+_F Y⊆XF+。
七、属性闭包的计算
1. 覆盖
- 定义:对 R ( U ) R(U) R(U)上的两个函数依赖集合 F 、 G F、G F、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^+ \Leftrightarrow F \subseteq G^+ \wedge G \subseteq F^+ F+=G+⇔F⊆G+∧G⊆F+
- 如果要判断两个函数依赖集F、G是否等价,需要对任一 X → Y ∈ F + X \rightarrow Y \in F^+ X→Y∈F+检验是否 X → Y ∈ G + X \rightarrow Y \in G^+ X→Y∈G+。实际上通过上面的属性闭包的引理,可以将这种检验转为是否 Y ⊆ X G + Y \subseteq X^+_G Y⊆XG+,即求属性闭包。
2.计算一属性集关于一组函数依赖的属性闭包
- 算法:
Input:有限属性集合 U U U, U U U上的函数依赖集合 F F F,及 U U U的子集 X X X。
Output: X X X关于 F F F的属性闭包 X + X^+ X+,记为 X F + X^+_F XF+。
Method:按下列规则递归计算属性序列 X ( 0 ) , X ( 1 ) , . . . X^{(0)}, X^{(1)}, ... X(0),X(1),...
- 令 X ( 0 ) = X , i = 0 X^{(0)} = X, i = 0 X(0)=X,i=0
- B = { A ∣ ( ∃ V ) ( ∃ W ) ( V → W ∈ F ∧ V ⊆ X ( i ) ∧ A ⊆ W ) } B = \{A | (\exists V)(\exists W) (V \rightarrow W \in F \wedge V \subseteq X^{(i)} \wedge A \subseteq W)\} B={A∣(∃V)(∃W)(V→W∈F∧V⊆X(i)∧A⊆W)}
- X i + 1 = B ∪ X i X^{i+1} = B \cup X^{i} Xi+1=B∪Xi
- If X i + 1 ≠ X i X^{i+1} \not = X^{i} Xi+1=Xi, then i = i + 1; goto 2.
- X F + = X i X^{+}_F = X^{i} XF+=Xi,算法终止
- 示例:已知 R ( U , F ) , U = { A , B , C , D , E } , F = { A B → C , B → D , C → E , E C → B , A C → B } R(U, F), U = \{A, B, C, D, E\}, F = \{AB \rightarrow C, B \rightarrow D, C \rightarrow E, EC \rightarrow B, AC \rightarrow B\} R(U,F),U={A,B,C,D,E},F={AB→C,B→D,C→E,EC→B,AC→B}。求: ( A B ) F + (AB)^+_F (AB)F+
解:
(1) X ( 0 ) = { A , B } X^{(0)} = \{A, B\} X(0)={A,B}
(2) 由 A B → C , B → D AB \rightarrow C, B \rightarrow D AB→C,B→D: X ( 1 ) = X ( 0 ) ∪ { C , D } = { A , B , C , D } X^{(1)} = X^{(0)} \cup \{C, D\} = \{A, B, C, D\} X(1)=X(0)∪{C,D}={A,B,C,D}
(3) 由 C → E , A C → B C \rightarrow E, AC \rightarrow B C→E,AC→B: X ( 2 ) = X ( 1 ) ∪ { E } = { A , B , C , D , E } X^{(2)} = X^{(1)} \cup \{E\} = \{A, B, C, D, E\} X(2)=X(1)∪{E}={A,B,C,D,E}
(4) 由 E C → B EC \rightarrow B EC→B: X ( 3 ) = X ( 2 ) ∪ ∅ = { A , B , C , D , E } X^{(3)} = X^{(2)} \cup \emptyset = \{A, B, C, D, E\} X(3)=X(2)∪∅={A,B,C,D,E}
(5) 因为 X ( 3 ) = X ( 2 ) X^{(3)} = X^{(2)} X(3)=X(2),所以 ( A B ) F + = { A , B , C , D , E } (AB)^+_F = \{A, B, C, D, E\} (AB)F+={A,B,C,D,E}
八、函数依赖集的最小覆盖
- 引理:每个函数依赖集F可被一个其右端至多有一个属性的函数依赖之集G覆盖。
- 若 F F F满足以下条件,则称 F F F为最小覆盖或最小依赖集:
- F中每个函数依赖的右部是单个属性;
- 对任何 X → A ∈ F X \rightarrow A \in F X→A∈F,有 F − { X → A } ⇎ F F - \{X \rightarrow A\} \not \Leftrightarrow F F−{X→A}⇔F;(说明X是不可或缺的)
- 对任何 X → A ∈ F , Z ⊂ X X \rightarrow A \in F, Z \subset X X→A∈F,Z⊂X,有 ( F − { X → A } ) ∪ { Z → A } ⇎ F (F - \{X \rightarrow A\}) \cup \{Z \rightarrow A\} \not \Leftrightarrow F (F−{X→A})∪{Z→A}⇔F;(说明函数依赖左侧X没有多余的属性)
- 每个函数依赖集 F F F都有等价的最小覆盖 F ′ F^{\prime} F′。