这是最近向我提出的一个问题,给出了一个关系模式R = {A,B,C,D,E,G},并且在R,F = {DG -> AE, G -> C, BG -> AE, D -> CG}上有一组FDs,是否有任何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步骤的链接
发布于 2020-11-04 14:50:34
一些事实,假设FDs给出的关系的所有FD的规范覆盖。
原始关系的唯一候选键是{BD}。因此,您建议的3NF中的分解并不是无损的,因为没有任何关系模式包含这两个属性。
伯恩斯坦的综合算法实际上给出了以下分解:
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的合理替代。
https://stackoverflow.com/questions/64680389
复制相似问题