用DBMS中的例子解释BCNF
BCNF(BoyceCoddNormalForm)是3NF的高级版本。如果每个函数依赖X->Y,X是该表的超级键,则该表在BCNF中。对于BCNF,表应该是3NF,并且对于每个FD。LHS是超级钥匙。
示例
考虑具有属性(学生、学科、教师)的关系R。
F: { (student, Teacher) -> subject (student, subject) -> Teacher Teacher -> subject}
候选键是(学生,教师)和(学生,学科)。
上述关系在3NF中[因为没有传递依赖]。如果对于每个非平凡的FDX->Y,X必须是键,则关系R在BCNF中。
上述关系在BCNF中是没有的,因为在FD(teacher->subject)中,teacher不是key。这种关系存在异常-
例如,如果我们尝试删除学生Subbu,我们将丢失R.Prasad教授C的信息。这些困难是由教师是决定因素而不是候选键这一事实造成的。
BCNF的分解
教师->主题违反了BCNF[因为教师不是候选键]。
如果X->Y违反BCNF,则将R分为R1(X,Y)和R2(RY)。
所以R分为两个关系R1(Teacher,subject)和R2(student,Teacher)。
R1
R2
R中存在的所有异常,现在在上述两个关系中都被删除了。
笔记
BCNF分解并不总是满足依赖保留属性。在BCNF分解之后,如果不保留依赖关系,那么我们必须决定是要保留在BCNF中还是回滚到3NF。这个回滚过程称为非规范化。