你的问题
以下哪项是 R 的无损连接分解为
Boyce-Codd 范式 (BCNF)?
建议你有一组选项,你必须选择其中一个是无损分解,但由于你没有提到我首先(A部分)将关系分解为BCNF(先到 3NF,然后是 BCNF)然后(PART B)说明了如何检查这个给定的分解是否是无损连接分解。如果您只是想知道如何检查给定的 BCNF 分解是否无损或不直接跳转到我的答案的 B 部分。
A部分
要将关系 R 和一组函数依赖 (FD's) 转换为 3NF,您可以使用 伯恩斯坦综合。应用伯恩斯坦综合 -
-
首先我们确保给定的
FD's 集合是最小覆盖
-
第二我们采用每个
FD 并使其成为自己的子架构。
-
第三我们尝试结合这些子模式
例如在你的情况下:
R = {A,B,C,D}
FD = {A->B,C->D,AD->C,BC->A}
首先我们检查FD's 是否是最小覆盖(右侧单例,没有多余的左侧属性,没有多余的 FD)
-
Singleton RHS:所有给定的 FD 已经有单例 RHS。
-
没有多余的 LHS 属性: 没有一个 FD 具有需要删除的多余的 LHS 属性。
-
没有多余的 FD: 没有多余的 FD。
因此,给定的 FD 集已经是最小覆盖。
第二我们让每个FD 都有自己的子模式。所以现在我们有了 -(每个关系的键都是粗体)
R1={A,D,C}
R2={B,C,A}
R3={C,D}
R4={A,B}
第三我们看看是否可以组合任何子模式。我们看到 R1 和 R2 已经拥有R 的所有属性,因此 R3 和 R4 可以省略。所以现在我们有 -
S1 = {A,D,C}
S2 = {B,C,A}
这在 3NF 中。现在检查BCNF,我们检查这些关系(S1,S2)是否违反BCNF的条件strong>(即对于每个函数依赖X->Y左侧(X)必须是一个超级键) 。在这种情况下,这些都没有违反 BCNF,因此它也被分解为 BCNF。
第二部分
当您应用上面的 Bernstein 合成分解 R 时,分解总是保持依赖关系。现在的问题是,分解是无损的吗?要检查我们是否可以遵循以下方法:
创建一个如图 1 所示的表,其行数等于分解的关系数,列数等于我们原始给定 R 中的属性数。
我们将 a 放在我们在各自分解关系中存在的所有属性中,如图 1 所示。现在我们遍历所有 FD 的 {C->D, A->B,AD->C,BC->A} 一一添加,并尽可能添加a。例如,第一个 FD 是 C->D。由于 C 列中的两行都有 a 并且 D 列的第二行有一个空槽,我们放置了一个 a 如右图所示。一旦其中一行完全被 a 填充,我们就会停止,这表明它是无损分解。如果我们遍历所有的 FD,并且我们的表中没有一行完全被 a 填满,那么这是一个有损分解。
另外,请注意,如果它是有损分解,我们总是可以通过向由主键的所有属性组成的分解关系集再添加一个关系来使其无损。
我建议您观看this 视频,了解更多有关此方法的示例。还other way 检查涉及关系代数的无损连接分解。