-1

我正在尝试生成模式的 3NF 和 BCNF 分解。我一直在研究算法,但我对如何做到这一点感到非常困惑。

如果我有我的最小封面说:F' = {A->F, A->G, CF->A, BG->C)并且我已经确定了关系的一个候选键,说它是A. 那我具体该怎么做?

我一直在查看示例,其中一个具有以下内容:

F = {A → AB,A → AC,A → B,A → C,B → BC}

最小覆盖:F′ = {A → B,B → C}

最后的结果是:(AB,A → B), (BC,B → C)。他们是怎么做到的?

4

1 回答 1

1

如果我有我的最小封面说:F' = {A->F, A->G, CF->A, BG->C) 并且我已经确定了关系的一个候选键,说它是 A。那么我到底在做什么?

F' 不是最小覆盖:您必须将 A->F 和 A->G 组合到 A->FG

即使值 A 也不能是给定 F' 的候选键,因为 B 不属于 A 的闭包。可能的候选键是 AB。

对于 3NF,您首先为 F' 中的每个依赖项创建表,即

R1(A,F,G) R2(A,C,F) R3(B,C,G)

接下来检查其中一个表是否包含候选键。由于 B 仅出现在依赖项的左侧,因此 B 应该始终是候选键的一部分。唯一带有 B 的表是 R3,它不包含候选键(检查它!)。因此,我们添加一个带有候选键作为属性的新表 R4

R4(A,B)

最后,我们检查一个表的属性集是否包含在另一个表的属性集中。对于我们正在运行的示例,情况并非如此。

因此,我们的 3NF 分解是

  R1(A,F,G) R2(A,C,F) R3(B,C,G)  R4(A,B)

对于 BCNF,您从 R(A,B,C,F,G) 开始并查找 BCNF 违规。

例如,A->FG 违反了 BCNF,因为这种依赖关系不是微不足道的,而且 A 不是超键。因此,我们将 R 拆分为

R1(A,F,G) and R2(A,B,C)

所获得的关系都不包含违反 BCNF 的行为,因此该过程在此停止。

于 2012-04-15T07:27:38.323 回答