Boyce Codd 范式分解第二关系

Boyce Codd Normal Form Decomposition second Relationship

我有这个关系,正在尝试将其分解为 Boyce Codd 范式:

  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 结尾但没有超级键时,我在这些步骤中哪里出错了

(工人姓名, 项目) ?

在这个答案中,我假设 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,而依赖workerName → pay违反了范式。

所以,在第二步,我们将R2分解为:

R3(pay workerName) {workerName → pay}
R4(Role project workerName) {project workerName → Role}

所以,最后,正确的分解是R1R3R4,并且所有的依赖关系都被保留了。