首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将模式分解为3NF?

如何将模式分解为3NF?
EN

Stack Overflow用户
提问于 2015-11-13 23:41:35
回答 2查看 2.5K关注 0票数 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中,而在3NF中,F2没有。

根据F2,r不在3NF中,因为在函数依赖D->C中,

  1. D不是超级钥匙
  2. D->C不是琐碎的
  3. C,即C,不包含在任何候选键中。 根据F2的说法,R不在3NF中。

现在我如何把它转换成3NF呢?

我尝试了以下几点:

将R分解为(A,B,D,E) (C,D) (B,C,D,E),从而保持依赖关系。

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

EN

回答 2

Stack Overflow用户

发布于 2015-11-14 11:45:16

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

代码语言:javascript
复制
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. 检查子架构中是否包含至少一个键(true,因为这些键是{DE,B,A})

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

票数 3
EN

Stack Overflow用户

发布于 2017-05-25 02:28:12

  1. 分解之后,原始关系就消失了,新组件有自己的FDs (函数依赖项)& CKs (候选键),因此您可能不得不继续分解。
  2. 仅仅分解每个有问题的FD并不意味着没有更多的问题FDs。
  3. 根据阿姆斯特朗的公理,当某些FD成立时,另一些则成立。因此,可能有问题的FDs没有显式地提供给您。
  4. 分解可能无法“保存”FD,即没有任何组件包含FD的所有属性,因此如果FD有问题,您可能无法正确地分解。

所以,如果你想要分解成一个特定的NF (范式),使用一个已经被证明是这样的算法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33703457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档