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 结尾但没有超级键时,我在这些步骤中哪里出错了
(工人姓名, 项目) ?
在这个答案中,我假设 jobRole
和 Role
是相同的属性。
要在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}
所以,最后,正确的分解是R1
、R3
和R4
,并且所有的依赖关系都被保留了。
我有这个关系,正在尝试将其分解为 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 结尾但没有超级键时,我在这些步骤中哪里出错了
(工人姓名, 项目) ?
在这个答案中,我假设 jobRole
和 Role
是相同的属性。
要在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}
所以,最后,正确的分解是R1
、R3
和R4
,并且所有的依赖关系都被保留了。