假设'wiki'为关系R
,其属性url,title,..heading_pos分别为A,B,...H。
我们有,
R = {A,B,C,D,E,F,G,H}
FD's = {A->BC, E->F, AH->G}
这里的关键是ADEH。
我们可以先将关系转换R
为 3NF,然后再转换为 BCNF。
要将关系R
和一组函数依赖项(FD's
)转换为3NF
您可以使用伯恩斯坦的综合。应用伯恩斯坦的综合 -
- 首先我们确保给定的集合
FD's
是最小覆盖
- 其次,我们采用每个
FD
并使其成为自己的子模式。
- 第三,我们尝试结合这些子模式
例如在你的情况下:
首先我们检查是否FD's
是最小覆盖(单例右侧,没有多余的左侧属性,没有多余的 FD)
- Singleton RHS:我们用单例 RHS 编写 FD。所以现在我们有 FD 为 {A->B, A->C, E->F, AH->G}
- 没有无关的 LHS 属性:如果有的话,我们会删除无关的 LHS 属性。这里没有无关的 LHS 属性。
- 没有多余的 FD:如果有的话,我们会删除多余的依赖项。这里没有多余的依赖。
其次,我们使每个子模式都有FD
自己的子模式。所以现在我们有了 - (每个关系的键都是粗体的)
R 1 ={ A ,B}
R 2 ={ A ,C}
R 3 ={ E ,F}
R 4 ={ A,H ,G}
第三,我们将所有子模式与相同的 LHS 结合起来。所以现在我们有 -
S 1 = { A ,B,C}
S 2 = { E ,F}
S 3 = { A,H ,G}
由于上述分解的关系都不包含R的键,我们需要创建一个附加的关系模式,其中包含R的键形式的属性。这是为了确保保留依赖关系的无损连接分解。所以我们添加 -
S 4 = { A,D,E,H }
这是在3NF中。现在要检查BCNF,我们检查这些关系(S 1,S 2,S 3,S 4)是否违反了BCNF的条件(即,对于每个函数依赖X->Y
,左侧 ( X
)必须是超键)。在这种情况下,这些都没有违反BCNF,因此它也被分解为BCNF。
注意 - 在此示例中,其中一些步骤的重要性可能不清楚。在此处和此处查看其他示例。