用 DBMS 中的示例解释 BCNF

dbmsdatabasebig data analytics更新于 2026/1/13 4:22:17

BCNF(Boyce Codd 范式)是 3NF 的高级版本。如果一个表符合 BCNF,则每个函数依赖项 X->Y 的 X 都是该表的超键。对于 BCNF,该表应该符合 3NF,并且对于每个函数依赖项,LHS 都是超键。

示例

考虑一个包含属性(student, subject, teacher)的关系 R。

StudentTeacherSubject
JhansiP.NareshDatabase
jhansiK.DasC
subbuP.NareshDatabase
subbuR.PrasadC
F: { (student, Teacher) -> subject
(student, subject) -> Teacher
Teacher -> subject}

候选键为 (student, teacher) 和 (student, subject)。

上述关系符合 3NF(因为不存在传递依赖)。如果对于每个非平凡函数表达式 X->Y,X 必定是键,则关系 R 符合 BCNF。

上述关系不符合 BCNF,因为在函数表达式 (teacher->subject) 中,teacher 不是键。此关系存在异常 −

例如,如果我们尝试删除学生 Subbu,我们将丢失 R. Prasad 教 C 的信息。这些困难是由于 teacher 是决定因素,但不是候选键造成的。

BCNF 分解

teacher->subject subject 违反 BCNF(因为 teacher 不是候选键)。

如果 X->Y 违反 BCNF,则将 R 分为 R1(X, Y) 和 R2(R-Y)。

因此,R 被分为两个关系 R1(Teacher, subject) 和 R2(student, Teacher)。

R1

TeacherSubject
P.Nareshdatabase
K.DASC
R.PrasadC

R2

StudentTeacher
JhansiP.Naresh
JhansiK.Das
SubbuP.Naresh
SubbuR.Prasad

R 中存在的所有异常,现在已从上述两个关系中移除。

注意

BCNF 分解并不总是满足依赖性保留属性。如果 BCNF 分解后依赖性未保留,则我们必须决定是保留 BCNF 还是回滚到 3NF。此回滚过程称为非规范化。


相关文章