如何将模式分解为3NF?

问题描述 投票:2回答: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. Y-X中的每个属性都包含在候选键中

据我所知,根据F1,R在3NF,而在F2N则不在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),使得依赖性也被保留。

这是正确的,有没有其他方法可以分解?

database-design database-normalization 3nf bcnf
2个回答
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})

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


0
投票
  1. 分解后,原始关系消失了,新组件有自己的FD(功能依赖)和CK(候选键),因此您可能不得不继续分解。
  2. 根据有问题的FD进行分解并不意味着没有更多有问题的FD。
  3. 根据阿姆斯特朗的公理,当一些FD持有时,其他人持有。因此,可能存在有问题的FD,而您没有明确给出。
  4. 分解可能无法“保留”FD,即没有组件包含FD的所有属性,因此如果FD存在问题,则可能无法正确分解。

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

© www.soinside.com 2019 - 2024. All rights reserved.