我有这种关系,并试图将其分解为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)?
答案 0 :(得分:1)
在这个答案中,我假设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
,而依赖项{{1}违反了正常形式。
因此,在第二步,我们将workerName → pay
分解为:
R2
因此,最后,正确的分解是R3(pay workerName) {workerName → pay}
R4(Role project workerName) {project workerName → Role}
,R1
和R3
,并保留所有依赖关系。