0

这是最近向我提出的一个问题,给定关系模式R = {A,B,C,D,E,G}和 R 上的一组 FD F = {DG -> AE, G -> C, BG -> AE, D -> CG},是否有任何 BCNF 分解是无损和保留依赖关系的?

我在关系 R 上尝试了不同的 BCNF 分解,但我找不到令人满意的分解。

因此,我尝试使用 Bernstein 的综合算法创建 3NF 模式。我计算出的最小覆盖为F'= {BG -> A, BG -> E, G -> C, D -> G, D -> E, D -> A}. 从这里开始,我只是把它分解成更小的模式:{BGA}, {BGE}, {GC}, {DG}, {DE}, {DA}.

但这不是在 BCNF 中吗?如果它在 BCNF 中,它看起来是无损的并且还保留了依赖关系。我已经使用函数依赖闭包 F+ 检查了依赖关系的保存。一切似乎都是合法的。即使在和我的同学讨论之后,我们都对为什么会这样感到困惑。

有人告诉我,我正在使用的 BCNF 分解:在 F 中找到一个在 R 中存在的违反 FD 并将其删除,将能够找到一个有效的分解,该分解既无损又保留依赖性(如果有的话)。我相信我清楚地遵循了这些步骤,所以我计算的 3NF 模式应该是正确的。至于BCNF分解,我按照书上的算法,找到违规的FD并使其成为子关系,并在剩余关系中只保留FD的行列式并重复。但我无法到达架构:{BGA}, {BGE}, {GC}, {DG}, {DE}, {DA}.

所以我的问题是为什么我能够使用合成算法找到令人满意的 BCNF 分解,其中分解只是最小覆盖,但我无法使用教科书分解算法来做到这一点?(假设我采取的所有步骤都是正确的)

编辑:这是BCNF 步骤的链接

4

1 回答 1

1

一些事实,假设给定的 FD 形成了关系的所有 FD 的规范覆盖。

原始关系的唯一候选键是{BD}。因此,您建议的 3NF 分解不是无损的,因为没有关系模式包含这两个属性。

紧跟 Bernstein's Synthesis 算法实际上给出了以下分解:

R1 (A B E G) with cover of projected dependencies {BG → E, BG → A} and candidate key BG
R2 (A D E G) with cover of projected dependencies {D → G, D → E, D → A} and candidate key D
R3 (C G) with cover of project dependencies {G → C} and candidate key G
R4 (B D) with no non-trivial dependencies

这种分解保留了数据和依赖关系。此外,所有模式也满足 BCNF。

所以,现在的问题是:为什么寻找 BCNF 的分析算法在这种情况下只产生具有依赖性丢失的分解?好吧,答案很简单,即使通过以任何顺序消除违反 BCNF 的 FD 来应用这种算法,也不能保证找到所有可能的分解(也不保证找到的解决方案保留依赖关系)。简单地说,它是一种众所周知的(且简单的)算法,在 BCNF 中进行分解,因此,在许多数据库书籍中都可以找到它。由于上述(和其他)原因,在实践中,3NF 通常被认为是 BCNF 的合理替代方案。

于 2020-11-04T14:50:34.400 回答