假设模式 R(A,B,C,D,E) 具有功能依赖关系 AB -> ABCDE(AB 是超键)和 C -> B(B 是键 AB 的一部分,因此对于所有依赖关系,该模式都符合 3NF)。
B 是键 (AB) 的一部分,这有什么帮助?
仍有可能出现 AB -> ... C ... -> B,例如 (1,2,3,4,5) (2,2,3,4,5),其中 C 是部门编号,B 是该公寓的工作人员人数。即使 C 是主要属性,它也不会消除冗余。如果 C 不是主要属性,也会发生同样的情况。
那么这个定义是如何消除冗余的呢?
定义部分“X -> Y 属于 3NF,如果...或者如果 Y 是主要属性”(其他先决条件明确)如何完全消除冗余?
例如有 (1,2,3,4,5) 和 (1,x,3,4,6):为了满足 C -> B,x 应该是 2,但是如果 x 是 2,则 AB -> ABCDE 就不会满足,从而产生矛盾。
3NF 并不能消除所有更新异常。
3NF 是在更高级 NF 之前发现的,并且是根据传递 FD 定义的,不涉及您的子句。
删除某些 3NF 定义中的子句可得到 BCNF。BCNF 不会删除所有更新异常。它是最低级的 NF,其中删除了由于问题 FD(函数依赖性)导致的所有更新异常。
ETNF 是最低的 NF,其中所有更新异常都被删除。它们在更高的 NF 中仍然不存在。(一直到 5NF 并结束于 6NF)。超出 BCNF 的更新异常是由于问题 JD(连接依赖关系)造成的。
更新异常并不是“冗余”的唯一来源。(冗余是一个模糊、笼统且定义多重的术语。)