范式分解专题


范式分解专题

第一题:基础线性依赖(理解 3NF 保持依赖与 BCNF 的一致性)

题目: 关系模式 $R(A, B, C, D)$,函数依赖集 $F = {A \rightarrow B, B \rightarrow C, C \rightarrow D}$。

  1. 请将其分解为 3NF。
  2. 请将其分解为 BCNF。

【答案与解析】

  • 候选码:$A$(只有 $A$ 能推导出全部属性)。

  • 3NF 分解(合成法)

    1. $F$ 本身就是最小依赖集。
    2. 合成:$R_1(A, B)$,$R_2(B, C)$,$R_3(C, D)$。
    3. 无损连接检查:候选码 $A$ 已包含在 $R_1$ 中。
    4. 结果:${R_1(A, B), R_2(B, C), R_3(C, D)}$。
  • BCNF 分解(分解法)

    1. $B \rightarrow C$ 违反 BCNF($B$ 不是码)。拆分 $R$ 为:$R_1(B, C)$ 和 $R_{rest}(A, B, D)$。
    2. 在 $R_{rest}$ 中,$C \rightarrow D$ 丢失了,但原依赖中 $B \rightarrow C$ 且 $C \rightarrow D \Rightarrow B \rightarrow D$。考察 $R_{rest}$ 上的依赖:$A \rightarrow B$ 和 $B \rightarrow D$。
    3. $B \rightarrow D$ 违反 BCNF。拆分 $R_{rest}$ 为:$R_2(B, D)$ 和 $R_3(A, B)$。
    4. 结果:${R_1(B, C), R_2(B, D), R_3(A, B)}$。
    • 注:此题 BCNF 和 3NF 结果在逻辑上是等价的。

第二题:主属性循环依赖(理解 BCNF 丢失依赖的代价)

题目: 关系模式 $R(S, T, C)$(学生, 教师, 课程),函数依赖集 $F = {(S, C) \rightarrow T, T \rightarrow C}$。

  1. 请将其分解为 3NF。
  2. 请将其分解为 BCNF。

【答案与解析】

  • 候选码:$(S, C)$ 和 $(S, T)$。

  • 3NF 分解

    1. 左部 $T$ 决定右部 $C$,$C$ 是主属性(候选码 $(S, C)$ 的一部分)。
    2. 根据 3NF 定义,由于 $C$ 是主属性,即使 $T$ 不是码,$T \rightarrow C$ 也不违反 3NF。
    3. 结果:$R$ 本身就已经是 3NF,无需分解。
  • BCNF 分解

    1. 检查 $T \rightarrow C$:决定因素 $T$ 不是码,违反 BCNF。
    2. 拆分:$R_1(T, C)$,$R_2(S, T)$(保留决定因素 $T$)。
    3. 结果:${R_1(T, C), R_2(S, T)}$。
    • 代价:原函数依赖 $(S, C) \rightarrow T$ 丢失了。

第三题:冗余依赖处理(练习最小依赖集)

题目: 关系模式 $R(A, B, C, D)$,函数依赖集 $F = {A \rightarrow B, B \rightarrow C, A \rightarrow C, D \rightarrow A}$。

  1. 请将其分解为 3NF。
  2. 请将其分解为 BCNF。

【答案与解析】

  • 候选码:$D$。
  • 3NF 分解
    1. 求最小依赖集:$A \rightarrow C$ 是冗余的(可以通过 $A \rightarrow B, B \rightarrow C$ 推出),删掉。得到 $G = {A \rightarrow B, B \rightarrow C, D \rightarrow A}$。
    2. 合成:$R_1(A, B)$,$R_2(B, C)$,$R_3(D, A)$。
    3. 无损检查:候选码 $D$ 在 $R_3$ 中。
    4. 结果:${R_1(A, B), R_2(B, C), R_3(D, A)}$。
  • BCNF 分解
    1. $A \rightarrow B$ 违反 BCNF($A$ 不是码)。拆:$R_1(A, B)$,$R_{rem}(A, C, D)$。
    2. 在 $R_{rem}$ 中,$A \rightarrow C$(由于 $A \rightarrow B, B \rightarrow C$ 推导出)违反 BCNF。拆:$R_2(A, C)$,$R_3(A, D)$。
    3. 结果:${R_1(A, B), R_2(A, C), R_3(A, D)}$。

第四题:综合

题目: 关系模式 $R(A, B, C, D, E)$,函数依赖集 $F = {A \rightarrow B, C \rightarrow D, AC \rightarrow E}$。

  1. 请将其分解为 3NF。
  2. 请将其分解为 BCNF。

【答案与解析】

  • 候选码:$AC$($A, C$ 只出现在左边,必须是码)。

  • 3NF 分解

    1. $F$ 已经是最小依赖集(没有冗余属性,没有冗余依赖)。
    2. 合成:根据 $A \rightarrow B$ 得到 $R_1(A, B)$;根据 $C \rightarrow D$ 得到 $R_2(C, D)$;根据 $AC \rightarrow E$ 得到 $R_3(A, C, E)$。
    3. 无损检查:候选码 $AC$ 在 $R_3$ 中,满足。
    4. 结果:${R_1(A, B), R_2(C, D), R_3(A, C, E)}$。
  • BCNF 分解

    1. 找出违反项:$A \rightarrow B$($A$ 不是码)。
    2. 第一次拆分:$R_1(A, B)$,$R_{rest}(A, C, D, E)$。
    3. 检查 $R_{rest}$:$C \rightarrow D$ 违反 BCNF($C$ 在 $R_{rest}$ 中不是码,$AC$ 才是)。
    4. 第二次拆分:$R_2(C, D)$,$R_3(A, C, E)$。
    5. 检查 $R_3$:只有 $AC \rightarrow E$,决定因素 $AC$ 是码,满足 BCNF。
    6. 结果:${R_1(A, B), R_2(C, D), R_3(A, C, E)}$。
    • 注:在这个例子中,两种算法殊途同归。

总结

  1. 3NF 关键点:一定要先算最小依赖集,最后一定要检查候选码是否在其中一个表里(不在就补一个表)。
  2. BCNF 关键点:只要看到“左边不是码”的依赖就切一刀。切完后看剩下的属性里还有没有违反项,递归下去。

👉 点击这里阅读下一篇:《语法树专题》


Author: linda1729
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source linda1729 !
评论
  TOC