函数依赖与模式分解

亚信的三面,曾被问到对数据库范式的理解,记得当时答得真的是一塌糊涂。现在借此机会来重温和复习一下。(简要说明一下,因为字符的关系,在本文里 ∈有时代表”属于“,有时代表”真包含“的意思,不便之处,敬请谅解)

函数依赖

函数依赖是一个从数学理论中派生的术语,它指明属性中的每一个元素(在某些行中),存在唯一一个元素(在同一行中)与之对应。假设关系表 T 中的行(元组)被记为r1,r2….rn,表中的每一个属性(列)被记为A、B….,字母 X、Y,…记为属性的子集。

用数学理论来解释就是对于至少存在两个给定属性A、B 的表 T,我们可以说 A → B。箭头 → 称作“函数决定”。(类比函数f(x),在函数的定义域里,给定一个 x 的值,就决定了 y 的值,不同是,函数依赖关注的是一个属性或一个属性集与另一个属性或属性集之间的依赖关系)。在函数里,当x1 = x2 时,可以推到出 f(x1) = f(x2),类似的可以这样理解,在表 T 中,已知两行 R1 和 R2,如果 R1(A) = R2(A),则可以推导出 R1(B) = R2(B)。

平凡依赖/非平凡依赖

对于 A → B,当 B 是 A 的一个子集,则该函数称为 平反依赖。如 {S#,C#} → {C#}。

所有关系都满足平法依赖,如包含属性集 X 的所有关系都会满足 X → X。平凡依赖在实际设计中是不使用的,通常,我们会通过消除平凡依赖来减少函数依赖的数量。当 B 不是 A 的子集时,我们称其为 非平反函数依赖。

完全函数依赖/部分函数依赖

完全函数依赖 用来表名函数依赖的决定因子的最小属性集(附:在函数依赖里,把左侧叫做 决定因子,右侧叫做 依赖因子。类似在函数里,把 x 叫做 变量,把 y 叫做 因变量。)。

属性集 Y 完全函数依赖于属性集 X,需要满足一下条件:

1)X → Y(Y 函数依赖于 X)

2)Y 不函数依赖于 X 的任意真子集

反过来说,当 X → Y,而又存在(X’ 为 X 的某一个真子集)X’ → Y 时,这时我们称其为 部分函数依赖。当 Y 部分函数依赖于 X 时,即根据 X 中的“部分”属性就可以确定对 Y 的关联,从数据依赖的观点看,X 中存在“冗余” 的属性。

传递与直接函数依赖

设有两个非平凡函数依赖 X → Y,Y → Z,当 X 不依赖于 Y,则称 Z 传递函数依赖于 X。

这里之所以规定" X 不函数依赖于 Y”,是因为当 Y → X 时,X 与 Y 就一一对应了,在这种情况下 Z 就直接函数依赖于 X(而不是我们所说的传递函数依赖)。

Z 传递函数依赖于 X,表名 Z 间接依赖于 X,从而表明 X 和 Z 之间关联较弱。

函数依赖的 Armstrong 公理

无冗余的函数依赖集函数依赖的完备集(闭包)是好的关系设计。由已知的函数依赖集可以推导出无冗余的函数依赖集 和 函数依赖的完备集(闭包)。

在此先说一下 Armstrong 的基本公理和推理规则:

基本公理:

1)(自反律)如果 Y ∈ X∈ U,则 X → Y 成立。(平凡函数依赖)

2)(增广律)如果 X → Y 在 R(U)  成立,且 Z∈ U,则 XZ → XY

3)(传递律)如果 X → Y,Y → Z 成立,则 X → Z 成立。

推理规则:

1)(合并):{X → Y,X → Z},则 X → YZ

2)(分解):{X → Y,Z ∈ Y},则 X → Z。(或:X → YZ,那么 X → Y,X → Z)

3)(伪传递):{X → Y,YW → Z},则 WX → Z

4)(复合):{X → Y,W → Z},则 XW → YZ

5)(自积律):{X → YZ,Z → W},则 X → YZW

对于 Armstrong 公理系统,为了进一步的了解,我们还需要深入的了解一下 属性集闭包 和 函数依赖集闭包。

属性闭包

概念:设 F 是属性集合 U 上的一个函数依赖集,X ∈ U,称 X+ = { A|A∈U,X → A 由 F 按照 Armstrong 公理系统推导得到 } 为属性集的 x 关于 F 的闭包。

举个例子:设有关系模式 R(U,F),U = ABC,F={A→B,B → C},则有 A 的闭包 A+ = ABC,B+=BC,C+=C。

函数依赖闭包和属性集闭包

一般来说,我们很少会求函数依赖闭包,因为这样会产生大量“无意义”或者意义不大的函数依赖。多数时候,我们关心的只是 F+ 的一个子集,常常伴随的问题是某函数依赖 X → Y 是否在 F+中。而求解这个问题的解决方式,通常是求在 F 下,属性集合 X 的闭包 X+(至于其证明,有兴趣的可以查阅一下相关资料)。

在这里只谈一下如何求解 X 的属性闭包:

1)设置初始值:令X(0) = ∅,X(1)= X,F’=∅。

2)若X(0)≠X(1),令 X(0)=X(1)。否则转向 4)。

3)构造函数依赖集合 F’={Y→Z | (Y→Z)∈F∩Y∈X(1)},令 F = F – F’,对于其中的每个函数依赖 Y→Z,令X(1) = X(1)∪Z,转向 2)。

4)输出 X(1),它就是X+

最小函数依赖集

概念:对于函数集 F ,称函数集Fmin 为F 的最小函数依赖集,如果 Fmin满足一下条件:

1)Fmin与 F等价:Fmin+=F+

2)Fmin中每个函数依赖 X→Y 的依赖因素为单元素集,即Y中只含有一个属性集合。

3)Fmin中每个函数依赖 X→Y的决定因素不存在冗余,即既要删除X中任何一个属性,就会改变Fmin的闭包。

4)Fmin中每个函数毒不是冗余的,即删除 Fmin 中任意一个函数依赖,就会改变Fmin 的闭包。

无损分解

概念:无损分解指的是对关系模式分解时,原关系模型下任一合法的关系值在分解之后应能通过自然联接运算恢复起来。反之,则称为有损分解。

这里解释一下:“损”代表了信息的丢失的丢失,可能发生的情况是:分解后的关系模式通过自然连接合并,原有元组丢失或增加了无意义的元组,此情况记为“损”。在实际应用当中,我们希望通过自然连接之后可恢复原有关系模式,既不减少也不增加新的元组。那如何才可以做到无损分解呢??答案是:保持原有关系模式的函数依赖

保持函数依赖的分解

分解需要保持函数依赖,因为 F 中每一个函数依赖都代表数据库的一个约束。如果模式分解不保持函数依赖,那在模式分解中就会丢失一些函数依赖。注意:这里保持原有的函数依赖,包括了通过原有函数依赖推到出来的函数依赖,可以理解为保持原有函数的 F+

你可能感兴趣的:(函数依赖与模式分解)