将关系分解为BCNF

时间:2013-02-27 01:13:36

标签: relational-database database-normalization decomposition

我无法确定何时关系是Boyce-Codd Normal Form以及如何分解信息BCNF(如果不是)。给出这个例子:

具有功能依赖性的R(A,C,B,D,E):A - > B,C - > d

我如何分解?

我采取的步骤是:

A+ = AB  
C+ = CD  
R1 = A+ = **AB**  
R2 = ACDE (since elements of C+ still exist, continue decomposing)  
R3 = C+ = **CD**  

R4 = ACE (此关系中没有FD闭包)

所以现在我知道ACE将构成整个关系,但分解的答案是:AB,CD,ACE。

我想我正在努力解决如何将关系正确地分解为BCNF形式以及如何判断你何时完成。非常感谢任何能够在解决这些问题时让我完成思考过程的人。谢谢!

2 个答案:

答案 0 :(得分:95)

虽然这个问题已经过时了,但其他问题/答案似乎并没有为确定和分解与BCNF的关系提供一个非常明确的循序渐进的答案。

<强> 1。确定BCNF:
对于关系R在BCNF中,R中保持的所有函数依赖性(FD)需要满足决定因素X都是R的超密钥的属性,即如果X-> Y保持在R中,那么X必须是超级密钥R属于BCNF。

在您的情况下,可以显示唯一的候选键(最小超级键)是ACE。 因此,两个FD:A-> B和C-> D都违反BCNF,因为A和C都不是超密钥或R。

<强> 2。将R分解为BCNF形式:
如果R不在BCNF中,我们将R分解为BCNF中的一组关系S. 这可以通过一个非常简单的算法来完成:

Initialize S = {R}
While S has a relation R' that is not in BCNF do:   
   Pick a FD: X->Y that holds in R' and violates BCNF
   Add the relation XY to S
   Update R' = R'-Y
Return S

在您的情况下,迭代步骤如下:

S = {ABCDE}       // Intialization S = {R}
S = {ACDE, AB}    // Pick FD: A->B which violates BCNF
S = {ACE, AB, CD} // Pick FD: C->D which violates BCNF
// Return S as all relations are in BCNF
因此,R(A,B,C,D,E)被分解成一组关系:满足BCNF的R1(A,C,E),R2(A,B)和R3(C,D)。

另请注意,在这种情况下,保留了函数依赖性,但对BCNF的规范化并不能保证这一点。

我希望这会有所帮助。

答案 1 :(得分:0)

1NF - &gt; 2NF - &gt; 3NF - &gt; BCNF

根据给定的FD设置&#34; ACE&#34;形成关键。 显然R(A,B,C,D,E)不在2NF中。 2NF分解得到R1(A,B),R2(C,D)和R3(A,C,E)。 这种分解的分解关系在3NF和BCNF中。