BCNF 中的依赖性保留分解
Dependency preserving decomposition that is in BCNF
这是最近向我抛出的一个问题,给定一个关系模式 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分解,分解只是最小覆盖,而我用教科书分解算法却做不到? (假设我采取的所有步骤都是正确的)
编辑:这是 link BCNF 步骤
一些事实,假设给定的 FD 形成关系的所有 FD 的规范覆盖。
原始关系的唯一候选键是{BD}
。因此,您提出的 3NF 分解不是无损的,因为没有关系模式包含这两个属性。
紧跟 Bernstein 的 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 的合理替代方案。
这是最近向我抛出的一个问题,给定一个关系模式 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分解,分解只是最小覆盖,而我用教科书分解算法却做不到? (假设我采取的所有步骤都是正确的)
编辑:这是 link BCNF 步骤
一些事实,假设给定的 FD 形成关系的所有 FD 的规范覆盖。
原始关系的唯一候选键是{BD}
。因此,您提出的 3NF 分解不是无损的,因为没有关系模式包含这两个属性。
紧跟 Bernstein 的 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 的合理替代方案。