Boyce Codd Normal Form分解第二关系

时间:2016-05-20 14:07:48

标签: database-design relational-database relationship

我有这种关系,并试图将其分解为Boyce Codd Normal Form:

  Relationship   R(workerName, pay, project, budgetAllocated, jobRole ) 

        having key (workerName, project)

        And the following Functional Dependencies:

        workerName  -> pay 
        project -> budgetAllocated
        workerName, project -> Role

I have come with this output so far, is this output correct?

    workerName, project ->Role
    project -> budgetAllocated, pay
 i know the first Relationship is in BCNF because of the super key (workerName, project )

what about the second ?

Using the Algorithm:

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(workerName, pay, project, budgetAllocated, jobRole ) 


workerName  -> pay 
project -> budgetAllocated
workerName, project -> Role

S = {workerName, pay, project, budgetAllocated, jobRole }           // Intialization S = {R}
S = {(project,budgetAllocated, jobRole) , (workerName, pay )       // Pick FD: workerName -> pay which violates BCNF
S = {(jobRole), (workerName, pay ) , (project, budgetAllocated)    // Pick FD: project -> budgetAllocated which violates BCNF

我在这些步骤中出错了,因为我以jobRole结束但没有超级密钥

(workerName,project)?

1 个答案:

答案 0 :(得分:1)

在这个答案中,我假设jobRoleRole是相同的属性。

要在BCNF中进行分解,首先应该找到违反此形式的依赖关系,即决定因素不是超级密钥。

例如,在这种情况下,依赖项project → budgetAllocated违反了BCNF,因为project不是超级密钥。然后你应该将原始关系分为两部分,一部分属性由project确定,另一部分属性为+ project,即:

R1(project, budgetAllocated) {project → budgetAllocated}
R2(workerName, pay, project, Role) {workerName → pay, project workerName → Role}

现在,R1在BCNF中,因为依赖项的决定因素是一个键,而R2必须被分解,因为它的键是project, workerName,而依赖项{{1}违反了正常形式。

因此,在第二步,我们将workerName → pay分解为:

R2

因此,最后,正确的分解是R3(pay workerName) {workerName → pay} R4(Role project workerName) {project workerName → Role} R1R3,并保留所有依赖关系。