跳到主要内容

5.3.2 最小函数依赖集

5.3.2.1 闭包

AA 能在依赖关系 FF 下推导出 BB,则 BBAA 关于 FF 的闭包,记作:(A)F+=B(A)_{F}^{+}=B

计算方法如下,若求 (U)F+(U)_{F}^{+},其中 U=ABU=AB

  1. X0=ABX_0=AB
  2. 在依赖关系 FF 中寻找左边是 AABBABAB 的关系,把右边并起来,令为 X1X_1
  3. X1=UX_1=U,或 X1=X0X_1=X_0,则 (U)F+=X1(U)_{F}^{+}=X_1;否则令 X0=X1X_0=X_1,重复步骤 2。

例题:

  1. 已知关系 R(A,B,C,D,E,G)R(A,B,C,D,E,G) 满足函数依赖关系:

    F={ABC, DEG, CA, BEC, BCD, CGBD, ACDB, CEAG}F=\{AB \rightarrow C,\ D \rightarrow EG,\ C \rightarrow A,\ BE \rightarrow C,\ BC \rightarrow D,\ CG \rightarrow BD,\ ACD \rightarrow B,\ CE \rightarrow AG\}

    (BD)F+(BD)^{+}_{F}

    参考答案

    解:令 (BD)0=BD(BD)^0=BD,则

    (BD)1=BDEG=BDEG(BD)^1=BD \cup EG=BDEG,

    (BD)1=BDEGC=BDEGC(BD)^1=BDEG \cup C=BDEGC,

    (BD)2=BDEGCAG=BDEGCA=R(BD)^2=BDEGC \cup AG=BDEGCA=R,

    于是:(BD)F+=BDEGCA(BD)^{+}_{F}=BDEGCA

  2. 已知关系 R(A,B,C,G,H,I)R(A,B,C,G,H,I) 满足函数依赖关系:

    F={AB, AC, CGH, CGI, BH}F=\{A \rightarrow B,\ A \rightarrow C,\ CG \rightarrow H,\ CG \rightarrow I,\ B \rightarrow H\}

    (AG)F+(AG)^{+}_{F}

    参考答案

    解:令 (AG)0=AG(AG)^0=AG,则

    (AG)1=AGBC=AGBC(AG)^1=AG \cup BC=AGBC,

    (AG)1=AGBCHI=AGBCHI=R(AG)^1=AGBC \cup HI=AGBCHI=R,

    于是:(AG)F+=AGBCHI(AG)^{+}_{F}=AGBCHI

5.3.2.2 最小函数依赖集

定义:

  • 任一函数的右边只有一个属性;
  • 不存在冗余(多余)的函数;
  • 函数的左边不能有冗余属性。

计算步骤如下,若求函数依赖 FF 的最小依赖集 FF'

  1. 用分解规则将所有依赖右边均分解为单属性依赖。
  2. 去掉 FF 中多余的依赖。依次尝试去掉一个依赖关系:
    1. 若删除会导致依赖关系少一个甚至多个元素,则不能去掉,否则继续尝试去掉。
    2. 假设去掉的是 XYX \rightarrow Y,在剩下的依赖关系中求 XF+X^{+}_{F} 是否含 YY,若包含则去掉,且下一次计算时使用去掉之后的函数依赖,否则不能去掉。
  3. 去掉各依赖左边多余的属性。依次检查左边不是单属性的依赖,假设是 XYZXY \rightarrow Z,求 XZX \rightarrow Z 是否包含 ZZ,若包含则去掉 YY,即保留 XZX \rightarrow Z

例题:

  1. 求函数依赖关系 FF 的最小函数依赖集:

    F={ABC, ABC, BA, CAB, AD}F=\{AB \rightarrow C,\ A \rightarrow BC,\ B \rightarrow A,\ C \rightarrow AB,\ A \rightarrow D\}
    参考答案

    解:展开所有右部不为单属性的依赖:

    F1={ABC, AB, AC, BA, CA, CB, AD}F'_{1}=\{AB \rightarrow C,\ A \rightarrow B,\ A \rightarrow C,\ B \rightarrow A,\ C \rightarrow A,\ C \rightarrow B,\ A \rightarrow D\}

    依次尝试去掉依赖关系:

    1. 尝试去掉 ABCAB \rightarrow C,令 (AB)0=AB(AB)^0=AB,则:

      (AB)1=ABCD=ABCD=R(AB)^1=AB \cup CD=ABCD=R

      (AB)F+=ABCD(AB)^{+}_{F}=ABCD,包含 CC,可以去掉。

    2. 尝试去掉 ABA \rightarrow B,令 (A)0=A(A)^0=A,则:

      (A)1=ACD=ACD(A)^1=A \cup CD=ACD

      (A)2=ACDB=ACDB=R(A)^2=ACD \cup B=ACDB=R

      (A)F+=ACDB(A)^{+}_{F}=ACDB,包含 BB,可以去掉。

    3. 尝试去掉 ACA \rightarrow C,令 (A)0=A(A)^0=A,则:

      (A)1=AD=AD(A)^1=A \cup D=AD

      (A)2=AD=(A)1(A)^2=AD=(A)^1

      (A)F+=AD(A)^{+}_{F}=AD,不包含 BB,不能去掉。

    4. 尝试去掉 BAB \rightarrow A,令 (B)0=B(B)^0=B,则:

      (B)1=B=(B)0(B)^1=B=(B)^0

      (B)F+=B(B)^{+}_{F}=B,不包含 AA,不能去掉。

    5. 尝试去掉 CAC \rightarrow A,令 (C)0=C(C)^0=C,则:

      (C)1=CBD=CBD(C)^1=C \cup BD=CBD

      (C)2=CBDA=CBDA=R(C)^2=CBD \cup A=CBDA=R

      (C)F+=CBDA(C)^{+}_{F}=CBDA,包含 AA,可以去掉。

    6. 尝试去掉 CBC \rightarrow B,令 (C)0=C(C)^0=C,则:

      (C)1=C=(C)0(C)^1=C=(C)^0

      (C)F+=C(C)^{+}_{F}=C,不包含 AA,不能去掉。

    7. ADA \rightarrow D 是唯一一个包含元素 DD 的依赖,不能去掉。

    此时得到:

    F2={AC, BA, CB, AD}F'_{2}=\{A \rightarrow C,\ B \rightarrow A,\ C \rightarrow B,\ A \rightarrow D\}

    整理可得:

    F={ACD, BA, CB}F'=\{A \rightarrow CD,\ B \rightarrow A,\ C \rightarrow B\}