要将关系R
和一组函数依赖项(FD's
)转换为3NF
您可以使用伯恩斯坦的综合。应用伯恩斯坦的综合 -
- 首先我们确保给定的集合
FD's
是最小覆盖
- 其次,我们采用每一个
FD
并使其成为自己的子模式。
- 第三,我们尝试结合这些子模式
例如在你的情况下:
R = {A,B,C,D,E,G}
FD's = {BG->CD,G->A,CD->AE,C->AG,A->D}
首先我们检查是否FD's
是最小覆盖(单例右侧,没有多余的左侧属性,没有多余的 FD)
- Singleton RHS:所以我们可以把我们的 FD 写成 { BG->C, BG->D, G->A, CD->A, CD->E, C->A, C->G, A->D }。
- 没有无关的 LHS 属性:我们可以
D
从 LHS 中删除CD->A
and CD->E
sinceD
是一个无关的属性(正如我们可以D
从C
since C->A 和 A->D中得到的那样)。所以我们现在有 {BG->C, BG->D, G->A, C->A, C->E, C->G, A->D}
- 没有多余的 FD:我们注意到这里有很多多余的依赖项。删除它们我们有 {BG->C, G->A, C->E, C->G, A->D}
其次,我们使每个子模式都有FD
自己的子模式。所以现在我们有了 - (每个关系的键都是粗体的)
R 1 ={ B,G ,C}
R 2 ={ G ,A}
R 3 ={ C ,E}
R 4 ={ C ,G}
R 5 ={ A ,D}
第三,我们看看是否可以组合任何子模式。我们看到R 3和R 4可以组合,因为它们具有相同的密钥。所以现在我们有 -
S 1 = {B,G,C}
S 2 = {A,G}
S 3 = {C,E,G}
S 4 = {A,D}
这是在3NF中。现在要检查BCNF,我们检查这些关系(S 1,S 2,S 3,S 4)是否违反BCNF的条件(即,对于每个函数依赖X->Y
,左侧 ( X
)必须是超键)。在这种情况下,这些都没有违反BCNF,因此它也被分解为BCNF。
注意我上面的最终答案是(AD,AG,CGE,BCG)
。您期望的解决方案是(AD,AG,CGE,BC)
,但这是错误的。这里的最后一个关系(S 1)也应该具有G
如上所示的属性。