假设模式 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 is in 3NF, if ... OR if Y is a prime attribute”(其他前提条件很清楚)如何完全消除冗余?
例如有 (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(连接依赖项)问题造成的。
更新异常并不是“冗余”的唯一来源。 (一个模糊的、笼统的、多重定义的术语。)