不保留功能依赖性的分解

时间:2011-11-15 07:49:42

标签: relational-database database-normalization functional-dependencies

什么时候BCNF分解不能保留功能依赖...我试图解决这个问题,比如R =(V,W,X,Y,Z)

4 个答案:

答案 0 :(得分:5)

取自Database Design and Relational Theory

R = (S, J, T)

{S, J} -> {T}
{T} -> {J}

这不在BCNF中,因为T -> J成立且T不是关键。

R1 = (T, J)R2 = (T, S)分解为{T}{T, S}为密钥。导致BCNF。

但是,依赖项{S, J} -> {T}将丢失。

答案 1 :(得分:1)

BCNF分解的重点是消除 not 形式key -> everything else

的功能依赖关系

因此,如果一张桌子有FD,请说A - > B,这样A不是键,这意味着你在表中存储冗余数据。因此,您创建一个包含A列和B列的新表,其中A为键,然后从原始表中删除B.

由于此更改,您将不再遭受删除异常,也不必更新多行只是为了更改A - > B关系。

因此,对于一个琐碎,天真的例子,假设您有一个包含列的员工表:

 employeeId   name   jobTitle    salary

假设jobTitle -> salary即具有相同职位的每个人总是赚取相同的薪水。假设“开发人员”的职称等同于90,000美元的薪水。如果您的数据库中有20个开发人员,那么为每行存储相同的$ 90,000冗余值将是愚蠢的。因此,您从employees表中删除salary列,并使用以下命令创建新的工资表:

 jobTitle_[key]   salary

然后,要获得员工的工资,请在工资表中查找。

答案 2 :(得分:1)

具有FD的R(a b c d e){A-> B,AC-> D,BD-> E}。 在这种关系中,AC是候选键,并且该关系不在2NF中,因为非素数B部分地依赖于键(AC)。 将此关系转换为bcnf分解为两个关系:R1(a b){a-> b} key = a R2(a c d e){ac-> de} key = a R1和R2都在bcnf中,因为每个行列式都是一个键,但它们不依赖于保留,因为bd-> e丢失了。

答案 3 :(得分:0)

Schema R=(V,W,X,Y,Z)

Functional dependencies:

V,W -> X
Y,Z -> X
  W -> Y

分解为BCNF,您将看到所有FD都无法在单个分解中保留。