依赖性
依赖关系定义
● 依赖关系是对某些关系的实例在模式中的约束,具有以下形式。
● 依赖关系的例子包括功能依赖、主键和唯一约束、外键约束、包含依赖以及连接依赖。
● 依赖性σ由关于模式中关系的实例中的元组的两个逻辑声明,ψ和ϕ定义。
一组实例{r1, ···, rn}满足依赖σ,记为:
● 一个实例s(一个表或一组表)违反了模式S(一个关系或一组关系)的一个依赖性σ,当且仅当它不满足σ。这被记为:
● 一个实例s(一个表或一组表)违反了模式S(一个关系或一组关系)满足(违反)一组依赖关系Σ,当且仅当它满足(不满足)Σ中的所有(至少一个)依赖关系。这被记为:
● 对于一个模式S,对于一个关系R,有一个功能依赖σ,一组功能依赖Σ,S与σ,R与Σ,分别指的是S,R的有效实例集,关于σ,对于Σ中的功能依赖。
● 当我们说一个依赖性σ,一组依赖性Σ,在一个关系R上,在一个模式S上持有,我们仅考虑S,R的有效实例,分别与σ,与Σ。
● 总的来说,约束和依赖关系可以用来维持完整性,定义范式,并改进数据库设计,以提高完整性和效率。
功能依赖
功能依赖性
案例
表employee记录了我们组织中不同员工的薪水。与工会的协议规定,薪水由职位决定。具体值已经通过谈判确定。文员的薪水是每月2000$,经理的薪水是每月3000$等。
● 薪水由职位决定。
● 这种业务规则可以转化为一种叫做功能依赖的完整性约束。它是一种完整性约束。我们写作:
{ position} → { salary}
● 这意味着我们不应该遇到一个表,在这个表中,两个有相同职位但薪水不同的员工。
定义: 一个关系模式R的实例r(一个表)满足功能依赖σ:X → Y,其中X ⊂ R且Y ⊂ R,当且仅当如果r的两个元组在X值上一致,那么它们在Y值上也一致。
● X → Y读作:X功能决定Y,X决定Y,Y依赖于X,或更随意地说,X暗示Y。
● 以下SQL查询用于找出是否违反了约束。
● 以下SQL CHECK约束实现了功能依赖。
● 在当代数据库管理系统中,我们无法实现此类CHECK约束。然而,当它对应于表的一个键时,我们可以通过声明UNIQUE或PRIMARY KEY约束来实现一个功能依赖性。
R = {A, B, C, D}
● 以下R的实例对于功能依赖{A, B} → {D}是有效的。
● 以下R的实例违反了功能依赖{A, B} → {D}。
● 以下(空的)R实例对于功能依赖{A, B} → {D}是有效的。这是最小的不违反功能依赖的实例。
● 以下R的实例违反了功能依赖{A, B} → {D}。它是违反功能依赖的最小实例。
● 在这种情况下,有许多可能的功能依赖性。
● 以下功能依赖性(在众多其他中)在这种情况下成立。
● 以下功能依赖性(在许多其他中)在这种情况下不成立。注意,它们可能偶然在给定实例上成立(特别是,它们总是在空实例上成立)。
平凡的功能依赖
定义:一个功能依赖X → Y是平凡的,当且仅当Y ⊂ X。
● 一个功能依赖X → Y是非平凡的,当且仅当。
● 一个功能依赖X → Y是完全非平凡的,当且仅当 且Y ∩ X = ∅
超键
● 超键是关系的一组属性,其知识决定了整个元组的值。
定义: 设R是一个关系。设S ⊂ R是R的一组属性。当且仅当S → R时,S是R的一个超键。
候选键
候选键是最小的超键(包含方面)。
定义: 设R是一个关系。设S ⊂ R是R的一组属性。当且仅当S → R且对于所有T ⊂ S, T ≠ S, T不是R的一个超键时,S是R的一个候选键。
主键是设计者偏好的候选键,或者如果只有一个候选键则为该候选键。
候选键和超键
定义 : 设Σ是关系模式R上的一组功能依赖。一个主属性是出现在R的某个候选键中的属性(否则称为非主属性)。
封闭与等价
定义: 设Σ是关系模式R的一组功能依赖。Σ的闭包,记为Σ+,是由Σ中的功能依赖逻辑推出的所有功能依赖的集合。
- Σ+中的一个平凡功能依赖。
- Σ+中的一个非平凡但不完全非平凡的功能依赖。
- Σ+中的一个完全非平凡的功能依赖。
仅凭功能依赖的定义,计算Σ+和测试是否属于Σ+是艰巨的任务。
等价
定义:如果两组功能依赖Σ和Σ′有相同的闭包,则它们等价。
Σ ≡ Σ′ Σ+ = Σ′+
我们说Σ′是Σ的一个覆盖(Σ是Σ′的一个覆盖)。
答案是肯定的,但我们需要更多的工具来高效地检查(不计算Σ+和Σ′+)。
属性封闭
定义:设Σ是关系模式R的一组功能依赖。一组属性S ⊂ R的闭包,记为S+,是所有函数依赖于S的属性的集合。
S + = { A ∈ R | ∃(S → { A}) ∈ Σ +}
一组属性的闭包可以通过功能依赖作为生产规则的固定点迭代应用来计算。
最小功能依赖集
最小功能依赖集基础
定义: 一组功能依赖Σ是最小的,当且仅当:
- Σ中每个功能依赖的右侧是最小的。即,每个功能依赖都是X → {A}的形式。
- Σ中每个功能依赖的左侧是最小的。即,对于Σ中形式为X → {A}的每个功能依赖,不存在Σ+中形式为Y → {A}的功能依赖,其中Y是X的一个真子集。
- 集合本身是最小的。即,Σ中的任何功能依赖都不能从Σ中的其他功能依赖推导出来。
最小覆盖
因此,一组功能依赖Σ的最小覆盖是一组功能依赖Σ′,它既是最小的也与Σ等价。
定理: 每一组功能依赖都有一个最小覆盖(也称为最小基)。
计算一组功能依赖Σ的最小覆盖Σ′′′的算法包含以下三个步骤:
- 简化(最小化)Σ中每个功能依赖的右侧以获得Σ′。
- 简化(最小化)Σ′中每个功能依赖的左侧以获得Σ′′。
- 简化(最小化)集合Σ′′以获得Σ′′′。
这三个步骤必须按此顺序执行。
紧凑覆盖和紧凑-最小功能依赖集
定义:一组功能依赖Σ是紧凑的,当且仅当没有具有相同左侧的不同功能依赖。
∀X ∈ R; ∀Y ∈ R; ∀Z ∈ R; ((X → Y ∈ Σ ∧ X → Z ∈ Σ) ⇒ Y = Z))
- 功能依赖集Σ = { {A} → {B}, {A} → {C}}不是紧凑的。
- 功能依赖集Σ = { {A} → {B, C}}是紧凑的。
定义: 一组功能依赖Σ是紧凑-最小的,当且仅当:
- 该集合是紧凑的。
- 每个功能依赖的左侧是最小的。即,对于Σ中形式为X → {A}的每个功能依赖,不存在Σ+中形式为Y → {A}的功能依赖,其中Y是X的一个真子集。
- 集合本身是最小的。即,Σ中的任何功能依赖都不能从Σ中的其他功能依赖推导出来。
紧凑覆盖和紧凑-最小覆盖
因此,一组功能依赖Σ的紧凑覆盖是一组功能依赖Σ′,它既是紧凑的也与Σ等价。
定理: 每一组功能依赖都有一个紧凑覆盖。
一个紧凑-最小覆盖(也称为规范覆盖)是一组功能依赖Σ′,它既是紧凑-最小的也与Σ等价。
定理 :每一组功能依赖都有一个紧凑-最小覆盖。
计算一组功能依赖Σ的紧凑-最小覆盖Σ′′′′的算法包含以下四个步骤:
- 简化(最小化)Σ中每个功能依赖的右侧以获得Σ′。
- 简化(最小化)Σ′中每个功能依赖的左侧以获得Σ′′。
- 简化(最小化)集合Σ′′以获得Σ′′′。
- 将Σ′′′中具有相同左侧的所有功能依赖重新组合以获得Σ′′′′(第1步的逆操作)。
这四个步骤必须按此顺序执行。
例子
- 计算属性闭包。
- 找出所有候选键。
- 找出一个最小覆盖。
- 找出一个紧凑-最小覆盖。
计算所有单属性闭包。
计算所有双属性闭包。
- 任何包含{A, B}或{A, C}的属性集是一个超键。{A, B}和{A, C}是候选键。
计算所有其它三属性闭包。
计算所有其它四属性闭包。
- 我们知道,所有五属性覆盖都是超键。
两个候选键是{A, B}和{A, C}。
我们计算一个最小覆盖。
简化右侧(简单)。
简化左侧(非常困难)。
简化集合本身,移除可以从其它功能依赖推导出来的功能依赖(困难)。
Σ′′′是Σ的一个最小覆盖。
考虑约束的不同顺序,我们可能达到不同的最小覆盖。
- 该算法总能找到一个最小覆盖,但有些最小覆盖可能通过算法无法达到。
- 例如,如果Σ已经是一个最小覆盖,算法无法达到一个不同的最小覆盖,即使它存在。
- 要保证用算法达到所有最小覆盖,需要从Σ+开始。
我们通过将具有相同左侧的约束重新组合来计算一个紧凑-最小覆盖(简单)。
其它紧凑-最小覆盖如下。
阿姆斯特朗公理
基础定义
定义:设R是一组属性。以下推理规则是阿姆斯特朗公理。
- 反射性 ∀X ⊂ R; ∀Y ⊂ R; ((Y ⊂ X) ⇒ (X → Y))
- 增强性 ∀X ⊂ R; ∀Y ⊂ R; ∀Z ⊂ R; ((X → Y) ⇒ (X ∪ Z → Y ∪ Z))
- 传递性 ∀X ⊂ R; ∀Y ⊂ R; ∀Z ⊂ R; ((X → Y ∧ Y → Z) ⇒ (X → Z))
技术上讲,阿姆斯特朗公理不是公理而是推理规则。
定理 : 反射性推理规则是正确的(正确,有效)。
定理 : 增强性推理规则是正确的。
定理 :传递性推理规则是正确的。
传递性的正确性证明:
- 设Σ是关系模式R上的一组功能依赖。设X → Y和Y → Z在Σ中。
- 我们知道,对于R的所有有效实例r与Σ (∀t1 ∈ r ∀t2 ∈ r (t1[X] = t2[X] ⇒ t1[Y] = t2[Y]))根据功能依赖的定义。
- 我们知道,对于R的所有有效实例r与Σ (∀t1 ∈ r ∀t2 ∈ r (t1[Y] = t2[Y] ⇒ t1[Z] = t2[Z]))根据功能依赖的定义。
- 因此,对于R的所有有效实例r与Σ (∀t1 ∈ r ∀t2 ∈ r (t1[X] = t2[X] ⇒ t1[Z] = t2[Z]))根据功能依赖的定义。
- 因此X → Z ∈ Σ+。
- Q.E.D.
定理 :设R为关系,具有功能依赖集Σ。我们可以通过应用阿姆斯特朗公理计算Σ+,直到不再产生新的功能依赖。
其他公理和规则
定理: 弱反射性是正确的。
∀X ⊂ R; (X → ∅)
证明:
- 设R为一个关系模式。
- 设X ⊂ R。
- 我们知道∅ ⊂ X。
- 因此根据反射性,X → ∅。
- Q.E.D(这就证明了)
定理: 弱增强性是正确的。
∀X ⊂ R; ∀Y ⊂ R; ∀Z ⊂ R; ((X → Y) ⇒ (X ∪ Z → Y))
证明:
- 设R为一个关系模式。
- 设X ⊂ R。
- 设Y ⊂ R。
- 设Z ⊂ R。
- 设X → Y。
- 我们知道X ⊂ X ∪ Z。
- 因此根据反射性,X ∪ Z → X。
- 因此根据(7)和(5)的传递性,X ∪ Z → Y。
- Q.E.D(这就证明了)
定理 :并集规则是正确的。
∀X ⊂ R; ∀Y ⊂ R; ∀Z ⊂ R; (((X → Y) ∧ (X → Z)) ⇒ (X → Y ∪ Z)) 证明省略
难题!
定理(VI) 阿姆斯特朗公理是完整的。 设Σ是关系模式R上的一组功能依赖,
X ⊂ R,A ∈ R, (X → {A} ∈ Σ+) ⇒ (Σ ⊢ X → {A})
定理(VI 逆命题) 设Σ是关系模式R上的一组功能依赖,
X ⊂ R,A ∈ R, (Σ ̸⊢ X → {A}) ⇒ (X → {A} ̸∈ Σ+)
⊢ 表示“可以使用阿姆斯特朗公理证明”。
证明:
- 我们知道Σ ̸⊢ X → {A}。
- 因此A ̸∈ X(否则我们可以使用反射性证明(1))。
- 让我们构造如下R的实例r,其中S = {B | Σ ⊢ X → {B}}。注意,根据构造,A ̸∈ S。该实例有两个元组。第一个元组对所有属性都有相同的值,比如说1。第二个元组对S中的属性有相同的值,比如说1,对于R − S中的属性有另一个值,比如说0。
- 假设存在Σ ⊢ V → W使得r ̸|= V → W。 4.1 因此V ⊂ S,否则r |= V → W(必须能够违反依赖)。 4.2 因此根据S的构造{B | Σ ⊢ X → {B}}和并集规则,Σ ⊢ X → V。 4.3 因此根据(4.2)和(4)的传递性,Σ ⊢ X → W。 4.4 因此根据S的构造,W ⊂ S。 4.5 因此由于V, W ⊂ S(它们都是1s),r |= V → W。 4.6 这是一个矛盾
- 因此如果Σ ⊢ V → W,则r |= V → W。
- 因此如果Σ ⊢ σ,则r |= σ。
- 我们知道∀σ ∈ Σ (Σ ⊢ σ)(空证明)。
- 因此根据(6),r |= Σ。
- 我们观察到根据构造r ̸|= X → {A}(验证A /∈ S)
- 因此根据蕴含的定义,由于(8)和(9),X → {A} ̸∈ Σ+。 所有验证Σ中功能依赖的实例都必须验证X → {A},以便被Σ蕴含。我们构建了一个不这样做的实例。 Q.E.D(这就证明了)。
多值依赖
动机
● Catalog关系是一个嵌套关系。
它处于非第一范式(NF2)。
● 指示的课程由所有指定的教师教授,并使用所有指定的教材。
● 课程决定了讲师的集合。
● 课程决定了文本的集合。
● 我们将Catalog关系转换为第一范式(1NF)。 有哪些异常?
● 依赖关系无法通过功能依赖捕获。它们是多值依赖。
● 与功能依赖不同,多值依赖是关系敏感的。
● 一位教师教授一门课程并使用一本教材的百分比。
● 之前的多值依赖不再成立。
基础定义
定义: 关系模式R的一个实例r满足多值依赖σ: X →→ Y,X多决定Y或Y多依赖于X,当且仅当,对于Z = R − (X ∪ Y),如果r的两个元组在X值上一致,则存在一个与第一个元组在X和Y值上一致并且与第二个元组在Z值上一致的元组。
r中的每个X值都与r中的一组Y值一致关联。
对于多值依赖X →→ Y,具有相同X值的两个不同元组的存在,意味着存在两个额外的具有Y值的元组(当Z值不同且Z ≠ ∅时)。
定义: 一个多值依赖X →→ Y是平凡的,当且仅当
- Y = R − X 或
- Y ⊂ X。
基础公理
定理 :补充推理规则是正确的。
- ∀X ⊂ R ;∀Y ⊂ R
- (X →→ Y) ⇒ (X →→ R − X − Y)
定理 : 增强推理规则是正确的。
- ∀X ⊂ R; ∀Y ⊂ R; ∀V ⊂ R; ∀W ⊂ R
- ((X →→ Y) ∧ (V ⊂ W)) ⇒ (X ∪ W →→ Y ∪ V)
定理 : 传递推理规则是正确的。
- ∀X ⊂ R; ∀Y ⊂ R; ∀Z ⊂ R
- ((X →→ Y) ∧ (Y →→ Z)) ⇒ (X →→ Z − Y)
定理: 复制(提升)推理规则是正确的。
- ∀X ⊂ R; ∀Y ⊂ R
- (X → Y) ⇒ (X →→ Y)
功能依赖是多值依赖的一个特例。
定理 :合并推理规则是正确的。
- ∀X ⊂ R; ∀Y ⊂ R; ∀Z ⊂ R; ∀W ⊂ R
- (X →→ Y) ∧ (W → Z) ∧ (Z ⊂ Y) ∧ (W ∩ Y = ∅)) ⇒ (X → Z)
定理 :补充、增强、传递、复制和合并,连同阿姆斯特朗公理形成了一个关于功能依赖和多值依赖的正确且完整的系统。
其他规则
定理 :多值并集推理规则是正确的。
- ∀X ⊂ R ;∀Y ⊂ R ;∀Z ⊂ R
- ((X →→ Y) ∧ (X →→ Z)) ⇒ (X →→ Y ∪ Z)
定理 :多值交集推理规则是正确的。
- ∀X ⊂ R; ∀Y ⊂ R; ∀Z ⊂ R
- ((X →→ Y) ∧ (X →→ Z)) ⇒ (X →→ Y ∩ Z)
定理 :多值差集推理规则是正确的。
- ∀X ⊂ R; ∀Y ⊂ R; ∀Z ⊂ R
- ((X →→ Y) ∧ (X →→ Z)) ⇒ (X →→ Y − Z)
- 没有分解规则。
纳入依赖关系
还有其他依赖性,如包含依赖和连接依赖。
定义 :关系模式{R1, R2} ⊂ S的实例r1和r2满足包含依赖σ,记作R1[X] ⊂ R2[Y],当且仅当πX(r1) ⊂ πY(r2)
定义: 一个关系模式R的实例r满足连接依赖σ,记作 ∗(πR1(R), ···, πRn(R)) ∈ Σ+,其中Ri ⊂ R,当且仅当
定义 :关系R上的连接依赖∗(R1, ···, Rn)是平凡的,当且仅当存在某个Ri使得 Ri = R。
我们如何理解功能依赖、多值依赖(及其他)?