2

模式 R = (A,B,C,D,E)

功能依赖 F1 = {A->BC , CD->E, B->D, E->A}
功能依赖 F2 = {A->D, A->E, DE->BC, B->A, D->C}

根据F1,候选键-A、E、BC、CD
根据F2,候选键-A、B、DE

模式在 3NF 中的条件:
对于所有 X->Y,以下至少一项为真:
1. X 是超键
2. X->Y 是平凡的(即 Y 属于 X)
3. YX 中的每个属性都包含在一个候选键中

我知道根据 F1,R 在 3NF 中,但根据 F2,R 不在 3NF 中。

根据 F2,R 不在 3NF 中,因为在功能依赖 D->C 中,
1. D 不是超键
2. D->C 不是平凡的
3. 作为 C 的 CD 不包含在任何候选键中。
所以根据 F2,R 不在 3NF 中。

现在如何将其转换为 3NF?

我尝试了以下方法:将
R 分解为 (A,B,D,E) (C,D) (B,C,D,E) 以同时保留依赖关系。

这是正确的,还有其他分解方法吗?

4

2 回答 2

3

您的示例的第三范式分解如下(在每个模式之后,我将功能依赖关系的投影放在它上面):

R1 <(A D E), {A → DE, DE → A}>    
R2 <(B D E), {DE → B, B → DE}> 
R3 <(A B), {B → A, B → A}>     
R4 <(C D), {D → C}> 

使用的算法是经典的伯恩斯坦算法。该算法的草图如下:

  1. 以规范形式转换依赖关系:在这种情况下,结果是 {A → D, A → E, DE → B, B → A, D → C}
  2. 使用相同的左侧部分对依赖项进行分组,在这种情况下:{A → DE, DE → B, B → A, D → C}
  3. 从每个组产生一个分解,在这种情况下:(ADE,DEB,BA,DC)
  4. 检查一个关系是否包含在另一个关系中(在这种情况下不会发生)
  5. 检查子模式中是否至少包含一个键(正确,因为键是 {DE, B, A})

请注意,您的分解不正确。

于 2015-11-14T11:45:16.380 回答
0
  1. 分解之后,原来的关系就没有了,新的组件有了自己的FD(功能依赖)和CK(候选键),所以你可能不得不继续分解。
  2. 仅根据有问题的 FD 进行分解并不意味着没有更多有问题的 FD。
  3. 根据阿姆斯特朗的公理,当一些 FD 成立时,其他一些 FD 成立。因此,您可能没有明确给出有问题的 FD。
  4. 分解可能无法“保留” FD,即没有组件包含 FD 的所有属性,因此如果该 FD 有问题,您可能无法正确分解。

因此,如果您想分解为特定的 NF(范式),请使用已被证明可以做到这一点的算法。

于 2017-05-25T02:28:12.870 回答