【数据库】第五章-关系数据库设计理论(1-函数依赖)

文章讨论了关系模式设计的优劣,重点介绍了数据依赖的概念,包括函数依赖的定义、分类(如完全函数依赖、部分函数依赖和传递函数依赖),以及Armstrong公理系统的应用。此外,文章还探讨了码的定义和最小依赖集的求解策略。
摘要由CSDN通过智能技术生成

关系模式设计的优劣之分

在以往的学校数据库的例子中,我们都是为学生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 XY。函数依赖英文为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 XY,若 Y ⊆ X Y\subseteq X YX ,则称 X → Y X\rightarrow Y XY是平凡的函数依赖;若 Y ⊈ X Y\not\subseteq X YX,则称 X → Y X\rightarrow Y XY是非平凡的函数依赖。
  • 决定因素
    对于函数依赖 X → Y X\rightarrow Y XY X X X叫做决定因素。

函数依赖与属性间的联系类型

  • X X X Y Y Y是1:1联系,如学号与身份证号,二者是相互函数决定/依赖的。
  • X X X Y Y Y是1:m联系,如系号与学号,有 Y → X Y\rightarrow X YX
  • 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 XY,且对任意 X X X的真子集 X ′ X' X,都有 X ′ ↛ Y X' \nrightarrow Y XY,则称 Y Y Y X X X完全函数依赖,记作 X → f Y X\xrightarrow[]{f}Y Xf Y,否则称为部分函数依赖,记作 X → p Y X\xrightarrow[]{p}Y Xp Y
  • 传递函数依赖
    R ( U ) R(U) R(U)中,如果 X → Y X\rightarrow Y XY Y → Z Y\rightarrow Z YZ,且 Y ↛ X Y\nrightarrow X YX,则称 Z Z Z X X X传递函数依赖,记作
    • 注:如果 X → Y X\rightarrow Y XY Y → Z Y\rightarrow Z YZ,一定有 X → Z X\rightarrow Z XZ,但不一定是传递函数依赖。

码的再定义

有了函数依赖的关系后,我们可以重新定义码:
如果 R ( U , F ) R(U,F) R(U,F)中的属性或属性组合 K K K K → f U K\xrightarrow[]{f} U Kf U,则称 K K K R R R的候选码。若候选码多于一个,则选定其中的一个作为主码。

函数依赖的Armstrong公理系统

F F F逻辑蕴含 X → Y X\rightarrow Y XY的定义

如果函数依赖 X → Y X\rightarrow Y XY能从 R < U , F > R<U,F> R<U,F> F F F中的函数依赖推出,则称 F F F逻辑蕴含 X → Y X\rightarrow Y XY。显然, 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 XY能够由 F F F根据Armstrong公理导出    ⟺    \iff Y ⊆ X F + Y\subseteq X_F^+ YXF+

属性集 X X X关于F的闭包 X F + X_F^+ XF+的定义

X X X中, X ⊆ U X\subseteq U XU,定义:
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+={AXA能由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+={AXA能由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^+ AXF+ do
    if A → B A\rightarrow B AB
    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 XYU,一定有 F F F逻辑蕴含 Y → X Y\rightarrow X YX。即之前提到的平凡函数依赖。
  • 增广律:若 F F F逻辑蕴含 X → Y X\rightarrow Y XY,且 Z ⊆ U Z\subseteq U ZU,则一定有 X Z → Y Z XZ\rightarrow YZ XZYZ。(这里 X Z XZ XZ Y Z YZ YZ分别是 X ∪ Z X\cup Z XZ Y ∪ Z Y\cup Z YZ的简写)
  • 传递性:若 F F F逻辑蕴含 X → Y X\rightarrow Y XY Y → Z Y\rightarrow Z YZ,则一定有 X → Z X\rightarrow Z XZ

可以证明以上三条显然成立。

Armstrong公理系统三条推理规则

由以上三条公理还可以得到如下三条推理规则:

  • 合并规则:若 X → Y X\rightarrow Y XY X → Z X\rightarrow Z XZ,有 X → Y Z X\rightarrow YZ XYZ
  • 分解规则:若 X → Y X\rightarrow Y XY Z ⊆ Y Z \subseteq Y ZY,有 X → Z X\rightarrow Z XZ
  • 伪传递规则:若 X → Y X\rightarrow Y XY W Y → Z WY\rightarrow Z WYZ,有 W X → Z WX\rightarrow Z WXZ。意思是添了新的条件,就能推出新的内容。

合并规则和分解规则实质上可以合并为如下规则:

  • 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) XY1Y2YnXYi(i=1,2n)
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+FG,GF

F F F的最小依赖集

F F F的最小依赖集,或称极小依赖集,或称最小覆盖,定义为满足以下三个条件的依赖集:

  • 右部为单属性:对于 F F F中的任意依赖 X → A X\rightarrow A XA A A A一定是单属性。
  • 左部无多余属性 F F F不存在 X → A X\rightarrow A XA X X X有真子集 X ′ ⊂ X X'\subset X XX,使 ( F − { X → A } ) ∪ { X ′ → A } (F-\{X\rightarrow A\})\cup \{X'\rightarrow A\} (F{XA}){XA} F F F等价。
  • 无多余FD F F F不存在 X → A X\rightarrow A XA,使 F − { X → A } F-\{X\rightarrow A\} F{XA} F F F等价。

算法:求 F F F的最小依赖集
Input: 函数依赖集 F F F
Output: 极小化后的 F F F

Step1:右部单属性化
  for F D i = X → Y ∈ F FD_i=X\rightarrow Y \in F FDi=XYF 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}){XA1,XA2,...,XAk}

Step2:消除左部多余属性
  for F D i = X → A ∈ F FD_i=X\rightarrow A \in F FDi=XAF 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 BiX do
        if A ∈ ( X − B i ) F + A\in (X-B_i)_F^+ A(XBi)F+
        then F F F:= ( F − { F D i } ) ∪ { ( X − B i ) → Y } (F-\{FD_i\})\cup \{(X-B_i)\rightarrow Y\} (F{FDi}){(XBi)Y}

Step3:消除多余FD
  do
    for F D i = X → A ∈ F FD_i=X\rightarrow A \in F FDi=XAF do
      if A ∈ X F − { F D i } + A\in X_{F-\{FD_i\}}^+ AXF{FDi}+
      then F F F:= F − { F D i } F-\{FD_i\} F{FDi}
  until F F F不再改变

注:不同的最小化顺序,所得的最小依赖集可能不一样。最小依赖集可能不是唯一的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值