将关系转换为 BCNF

问题描述

给定关系 R = {C,SN,OD,CH,CL,I,S,Y,D,RM,NS}。

以下函数依赖成立:

{C} -> {OD,CL}

{C,Y} -> {D,NS,I}

{RM,Y} -> {I,C,SN}

我需要将其转换为 BCNF。

我把它分成 2 个子关系 R1 = {C,CL} 和 R2={C,NS}

现在我可以看到 R1 在 BCNF 中,但我不确定 R2。这来自于 {C,I} 的想法,所以似乎一些非关键属性决定了关键的一部分。但是非关键属性也需要 S,Y 这些关键属性,所以我不确定 BCNF 规则是否成立。

BCNF 中的 R2 也是这样吗?

解决方法

假设你给出的函数依赖是R的所有函数依赖的覆盖,关系的候选键是{C,S,SN,Y}{D,RM,Y}。这可以通过计算两个属性集的闭包来检查,其中包含R的所有属性,而通过从中删除任何属性获得的闭包不包含所有属性。

您的分解在 BCNF 中,而 R2 在 BCNF 中。实际上,对 R2 依赖项的一个覆盖是:

{D,Y} -> {C,I,SN}
{C,Y} -> {D,NS,RM}

我们可以看到,在它们两个中,行列式都是候选键。