用 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。
| Student | Teacher | Subject |
|---|---|---|
| Jhansi | P.Naresh | Database |
| jhansi | K.Das | C |
| subbu | P.Naresh | Database |
| subbu | R.Prasad | C |
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
| Teacher | Subject |
|---|---|
| P.Naresh | database |
| K.DAS | C |
| R.Prasad | C |
R2
| Student | Teacher |
|---|---|
| Jhansi | P.Naresh |
| Jhansi | K.Das |
| Subbu | P.Naresh |
| Subbu | R.Prasad |
R 中存在的所有异常,现在已从上述两个关系中移除。
注意
BCNF 分解并不总是满足依赖性保留属性。如果 BCNF 分解后依赖性未保留,则我们必须决定是保留 BCNF 还是回滚到 3NF。此回滚过程称为非规范化。

