如何将模式分解为3NF?

时间:2015-11-13 23:41:35

标签: database-design database-normalization 3nf bcnf

模式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. Y-X中的每个属性都包含在候选键

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

根据F2,R不在3NF中,因为在功能依赖性D-> C,
中 1. D不是超级密钥
2.D-> C不是微不足道的 3. C中的C-D不包含在任何候选键中 因此,根据F2,R不在3NF中。

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

我尝试了以下内容:
将R分解为(A,B,D,E)(C,D)(B,C,D,E),使得依赖性也得以保留。

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

2 个答案:

答案 0 :(得分:2)

您示例的第三范式中的分解如下(在每个模式之后我将函数依赖项的投影放在其上):

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}> 

使用的算法是经典Bernstein’s algorithm。该算法的草图如下:

  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. 检查子模式中是否至少包含一个键(true,因为键是{DE,B,A})
  6. 请注意,您的分解不正确。

答案 1 :(得分:0)

  1. 分解后,原始关系消失了,新组件有自己的FD(功能依赖性)&amp; CK(候选键),所以你可能不得不继续分解。
  2. 根据有问题的FD进行分解并不意味着没有更多问题的FD。
  3. 当一些FD持有时,其他人持有,根据阿姆斯特朗的公理。因此,可能存在有问题的FD,您没有明确给出。
  4. 分解可能无法&#34;保留&#34; FD,即没有组件包含FD的所有属性,因此如果FD存在问题,您可能无法正确分解。
  5. 因此,如果您想要分解为特定的NF(正常形式),请使用已经证明可以做到这一点的算法。