Database design 如何将模式分解为3NF?

Database design 如何将模式分解为3NF?,database-design,database-normalization,3nf,bcnf,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,R不在3NF中 根据F2,R不在3NF中,因为在函数

模式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,R不在3NF中

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

现在如何将其转换为3NF

我尝试了以下方法:
将R分解为(A,B,D,E)(C,D)(B,C,D,E),以保持依赖性


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

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

R1
R2
R3
R4
所使用的算法是经典的。算法示意图如下所示:

  • 以规范形式转换依赖项:在本例中,结果为{A→ D、 A→ E、 德→ B、 B→ A、 D→ C}
  • 使用相同的左侧部分对依赖项进行分组,在本例中:{A→ 判定元件, 判定元件→ B B→ A. D→ C}
  • 从每组产生一个分解,在这种情况下:(ADE,DEB,BA,DC)
  • 检查一个关系是否包含在另一个关系中(在这种情况下,不会发生这种情况)
  • 检查子模式中是否至少包含一个键(true,因为键是{DE,B,a})
  • 请注意,您的分解是不正确的

  • 分解后,原始关系消失,新组件有自己的FD(功能依赖项)和CKs(候选键),因此您可能需要继续分解
  • 仅按问题FD分解并不意味着没有更多问题FD
  • 根据阿姆斯特朗的公理,当一些FD成立时,其他FD成立。因此,可能有一些问题的FD没有明确给出
  • 分解可能无法“保留”FD,即没有任何组件包含FD的所有属性,因此如果FD有问题,则可能无法正确分解
  • 所以,如果你想分解成一个特定的NF(标准形式),使用一个已经被证明可以做到这一点的算法

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