嘿,我有一个任务,上面写着:
令 R(ABCD) 是与函数依赖关系 A → B, C → D, AD → C, BC → A 下列哪一项是 R 到 Boyce-Codd 范式 (BCNF) 的无损连接分解?
我一直在 youtube 上研究和观看视频,但似乎找不到如何开始。我想我应该把它分解成子模式,然后填写一张表格来找出哪个是无损的,但我在开始时遇到了麻烦。任何帮助,将不胜感激!
嘿,我有一个任务,上面写着:
令 R(ABCD) 是与函数依赖关系 A → B, C → D, AD → C, BC → A 下列哪一项是 R 到 Boyce-Codd 范式 (BCNF) 的无损连接分解?
我一直在 youtube 上研究和观看视频,但似乎找不到如何开始。我想我应该把它分解成子模式,然后填写一张表格来找出哪个是无损的,但我在开始时遇到了麻烦。任何帮助,将不胜感激!
你的问题
以下哪一项是 R 到 Boyce-Codd 范式 (BCNF) 的无损连接分解?
建议您有一组选项,您必须选择其中一个是无损分解,但由于您没有提到选项,我将首先(第 A 部分)将关系分解为 BCNF(首先到 3NF,然后是 BCNF)然后(B 部分)说明如何检查这个给定的分解是否是无损连接分解。如果您只是想知道如何检查给定的 BCNF 分解是否无损或不直接跳到我的答案的 B 部分。
第一部分
要将关系R
和一组函数依赖项(FD's
)转换为3NF
您可以使用伯恩斯坦的综合。应用伯恩斯坦的综合 -
FD's
是最小覆盖FD
并使其成为自己的子模式。例如在你的情况下:
R = {A,B,C,D}
FD's = {A->B,C->D,AD->C,BC->A}
首先我们检查是否FD's
是最小覆盖(单例右侧,没有多余的左侧属性,没有多余的 FD)
因此,给定的 FD 集已经是最小覆盖。
其次,我们使每个子模式都有FD
自己的子模式。所以现在我们有了 - (每个关系的键都是粗体的)
R 1 ={ A,D ,C}
R 2 ={ B,C ,A}
R 3 ={ C ,D}
R 4 ={ A ,B}
第三,我们看看是否可以组合任何子模式。我们看到R 1和R 2已经具有 的所有属性,R
因此可以省略R 3和 R 4 。所以现在我们有 -
S 1 = {A,D,C}
S 2 = {B,C,A}
这是在3NF中。现在要检查BCNF,我们检查这些关系(S 1,S 2)中是否有任何违反BCNF的条件(即,对于每个函数依赖X->Y
,左侧 ( X
)必须是超键)。在这种情况下,这些都没有违反BCNF,因此它也被分解为BCNF。
B部分
当您如上所述应用伯恩斯坦合成分解R
时,分解总是保持依赖关系。现在的问题是,分解是无损的吗?要检查我们是否可以按照以下方法:
创建一个如图 1 所示的表,其行数等于分解的关系数,列数等于我们原始给定的属性数R
。
如图 1 所示,我们将a放入我们在各自分解关系中存在的所有属性中。现在我们遍历所有 FD 的 {C->D,A->B,AD->C,BC->A}一个,并尽可能添加一个。例如,第一个 FD 是 C->D。由于 C 列中的两行都有a并且 D 列的第二行有一个空槽,因此我们将 a a放在那里,如图右侧所示。一旦其中一行完全被a填充,我们就停止,这表明它是无损分解。如果我们遍历所有的 FD 并且我们的表中没有一行完全被a填充,那么这是一个有损分解。
另外,请注意,如果它是有损分解,我们总是可以通过向我们的由主键的所有属性组成的分解关系集再添加一个关系来使其无损。