本章理论性较强,晦涩难懂部分本人已做简单叙述,如有理解不到位之处,还请指出,谢谢

一.数据库规范性设计

为了避免数据库一致性问题,因此需要进行数据库规范性设计。需要满足三大理论:

  • 数据依赖理论
  • 关系范式理论
  • 模式分解理论

 

二.函数依赖

函数依赖

定义:\"R(U)\"是属性集合\"U=\\{A_1,A_2,...,A_n\\}\"上的一个关系模式,\"X,Y\" 是 \"U\"上两个子集,若\"R(U)\"的任意一个可能的关系\"r\"\"r\"中不可能有两个元组满足在\"X\"中属性值相等而在\"Y\"中属性值不等,则称函数\"X\"决定\"Y\",或函数\"Y\"依赖于X,记作\"X\\rightarrow

\"\"

 

再举两个抽象的例子:

\"\"

 

函数依赖的特性:

  • \"X\\rightarrow,但 \"Y,则称 \"X\\rightarrow 为非平凡的函数依赖
  • \"X\\rightarrow,任意两个元组,若\"X\"上值相等,则\"Y\"上值必然相等,称X为决定因素

 

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

  • \"R(U)\"中,若\"X\\rightarrow并且对\"X\"的任何真子集\"{{X}}\'\"都有\"{X}\',则称\"Y\"\"X\"完全函数依赖,记作\"X\\stackrel{f}{\\longrightarrow}Y\"
  • 否则称\"Y\"\"X\"部分函数依赖,记作\"X\\stackrel{p}{\\longrightarrow}Y\"

举例

\"\"

 

 

传递函数依赖

定义:在\"R(U)\"中,若\"X\\rightarrow\"Y\\rightarrow\"Y\"Z\"Z, \"Y\"不能决定\"X\",则称\"Z\"传递函数依赖于\"X\"

\"\"

 

候选键

定义:\"K\"\"R(U)\"的属性或属性组合,若\"K\\stackrel{f}{\\longrightarrow}Y\"则称\"K\"\"R(U)\"上的候选键

说明:

  • 可任选一候选键作为R的主键
  • 包含再任一候选键帐的属性称主属性,其他属性称非主属性
  • 若K是R的一个候选键,K\"\\subset\"S,则称S为R一个超键

\"\"

 

外键

定义:若\"R(U)\"中的属性或属性组合\"X\"并非\"R\"的候选键,但\"X\"却是另一关系的候选键,则称X为R的外来键,简称外键。

\"\"

 

逻辑蕴含

定义:设\"F\"是关系模式\"R(U)\"中的一个函数依赖集合,\"X,Y\"是R的属性子集,如果从\"F\"中的函数依赖能够推导出\"X\\rightarrow,则称\"X\\rightarrow\"F\"的逻辑蕴含,记作\"F\\models

这里简单说明下这个定义,关系模 式\"R(U)\"可以抽象成一个表,\"U\"表示该表中所有属性集合,\"F\"是一个函数依赖集合(比如集合内定义了完全函数依赖,传递函数依赖等),\"X,Y\"是表中的某两个属性或属性组,根据\"F\"集合中定义的关系可以推导出\"X\\rightarrow,则称\"X\\rightarrow\"F\"的逻辑蕴含。比如说如果A,那么B(参照离散数学)

 

闭包

\"F\"逻辑蕴含的所有函数依赖集合称为\"F\"的闭包,记作\"F^+\"

\"F^+=F\",则说\"F\"是一个函数依赖完备集

\"\"

 

三.函数依赖的公理和定理

Armstrong公理:

\"R(U)\"是属性集\"U=\\{A_1,A_2,...,A_n\\}\"上的一个关系模式,\"F\"\"R(U)\"的一组函数依赖,记为\"R(U,F)\",则有:

  • 自反律:若\"Y\\subseteq,则\"X\\rightarrow\"F\"逻辑蕴含(表明了一个属性组可以决定它自身的每一个属性)
  • 增广律:若\"X\\rightarrow,且\"Z\\subseteq,则\"XZ\\rightarrow\"F\"逻辑蕴含(表明了一个函数依赖,两边再加上属性,函数依赖依旧成立)
  • 传递律:若\"X\\rightarrow,且\"Y\\rightarrow,则\"X\\rightarrow\"F\"逻辑蕴含

公理的证明:

\"\"

 

 

由Armstrong公理推导出的定理:

  • 合并律:若\"X\\rightarrow\"X\\rightarrow,则\"X\\rightarrow
  • 伪传递律:若\"X\\rightarrow\"WY\\rightarrow,则\"XW\\rightarrow
  • 分解律:若\"X\\rightarrow\"Z\\subseteq,则\"X\\rightarrow

定理的证明:

\"\"

引理:如果\"A_1,A_2,...,A_n\"是属性,则\"X\\rightarrow当且仅当对每个\"A_i\"\"X\\rightarrow

 

属性集闭包

定义:对\"R(U,F)\"\"X\\subseteq\"U=\\{A_1,A_2,...,A_n\\}\",令\"X_F^+=\\{A_i|\"用Armstrong三个公理可从\"F\"导出\"X\\rightarrow,称\"X_F^+\"\"X\"关于\"F\"的属性闭包

简单地说明一下这个定义的含义:对于一个关系\"R\",可以抽象成一个表,\"U\"表示这个表中所有的属性,\"F\"是定义在表上的函数蕴含集合,\"X\"是表中部分属性组构成的,则\"X\"的属性集闭包就表示,由Armstrong公理在函数蕴含集合\"F\"上的运用可以推出\"X\"决定了\"R\"的某些属性,这些属性的集合就是\"X_F^+\"。即属性闭包是指所有由X属性(集)决定的属性的集合

 

由此定义推出重要定理:\"X\\rightarrow可从\"F\"由Armstrong Axiom导出,当且仅当\"Y\\subseteq

\"\"

定理:有了属性集闭包则可以证明Armstrong Axiom公理是有效的(由\"F\"出发根据Armstrong公理推导出的每一个函数依赖一定在\"F^+\")和完备性(被\"F\"逻辑蕴含的所有函数依赖都能由公理在\"F\"的基础上推出)

 

覆盖

定义:对\"R(U)\"上的两个函数依赖集合\"F\"\"G\",如果\"F^+=G^+\",则称\"F\"覆盖\"G\",或\"G\"覆盖\"F\"

引理:\"F^+=G^+\\Leftrightarrow

\"\"

 

属性闭包计算算法:

\"\"

以示例简单说明下算法如何进行:

首先,由算法1,\"X^{(0)}=\\{A,B\\}\"。由算法2中,\"V\\subseteq\"V\\rightarrow,这时候我们扫描\"F\"集合中的依赖关系,其中左边部分要为\"A,B,AB\",所以选择\"AB\\rightarrow\"B\\rightarrow,因此\"W=\\{,即\"B=\\{,由算法3,所以\"\"\"X^{(1)}=\\{A,B,C,D\\}\",但此时根据算法4不满足条件,再返回到算法2步骤,此时扫描\"F\"集合中左边部分是\"A,B,C,D\"任意组合的子集,找到\"C\\rightarrow\"AC\\rightarrow,得出\"B=\\{,所以\"X^{(2)}=\\{A,B,C,D,E\\}\",不满足条件5(其实这时\"X^{(2)}\"已经属于全部集合了,所以可以终止),再根据算法2,找到左边部分是\"A,B,C,D,E\"的组合,现在只剩下\"EC\\rightarrow了,所以无法找到\"W\"或者说\"W\\in,因此\"X^{(3)}=\\{A,B,C,D,E\\}\",循环中止,此时得到了结果\"(AB)_F^+=\\{A,B,C,D,E\\}\"

此算法的证明不再详述。

 

由上述的算法得到引理:

每个函数依赖集\"F\"可以被一个其右端至多由一个属性的函数依赖集\"G\"覆盖。

\"\"

这个引理的意思表示,假如\"X\\rightarrow,这里\"X,Y\"都有一个属性或多个属性构成,把\"Y\"拆成一个一个属性,那么函数依赖集\"G\"就包含了\"X\"决定了那些一个一个属性的集合。

 

最小覆盖

\"F\"满足一下条件,则称\"F\"为最小覆盖:

  • \"F\"中的每个函数依赖的右部是单个属性
  • 对任何\"X\\rightarrow,就有\"F-\\{X\\rightarrow不等价于\"F\"(这就表示了\"X\\rightarrow不可以去掉,不确切的类比可以认为这个集合不能去掉)
  • 对任何\"X\\rightarrow\"Z\\subset,\"(F-\\{X\\rightarrow(这里比上面多了一个\"\\{Z\\rightarrow,这其实就表明在原有集合不能去掉的基础之上,又加上了一个限制,就是集合\"X\"中没有多余的元素)

由此得到定理:每个函数依赖集\"F\"都有等价的最小覆盖\"{F}\'\"

\"\"

收藏 打印