关系模式:
R (ABCD)
函数依赖:
AB -> D
CB -> D
A -> C
C -> A
什么是最高范式?
我的理解:
候选键是
AB
和 BC
。
创建表时
AB
和 BC
不能同时为主键。
对于钥匙
AB
:AB -> D
(完全功能依赖,所以没问题)CB -> D
(?)A -> C
(部分功能依赖,因为其左侧仅包含部分键)C -> A
(函数依赖,所以没问题)
对于钥匙
BC
:AB -> D
(?)CB -> D
(完全功能依赖,所以没问题)A -> C
(函数依赖)C -> A
(部分功能依赖,因为它的左侧是键的一部分)
通过这两个键,关系包含部分功能依赖性。 所以它不属于 2NF。
但答案是3NF。为什么?
创建表时AB和BC不能作为主键。 那么我们就一一来吧
不。你可以一一考虑它们,但你必须考虑每一个候选键。关系模型没有为将一个候选键标记为“主要”提供理论依据。在 SQL 数据库中可能有很好的实际理由,但仅在关系模型中没有理论依据。
“部分函数依赖”的概念适用于非素数属性。唯一的非素数属性是 D。这里没有部分依赖。
根据阿姆斯特朗公理,当某些 FD 成立时,其他 FD 也必须成立。但你只看给定的 FD。
“部分FD”不是根据CK(候选密钥)定义的。 2NF 根据部分 FD 和 CK 进行定义。当任何 CK 上不存在非素数属性的部分 FD 时,2NF 成立。当没有部分 FD 时则不会。
PK(主键)是不相关的。 PK 只是您决定称之为“PK”的某个 CK。
当 Y 在功能上依赖于 X 的较小/适当的子集 S 时,Y 在功能上部分依赖于 X。但是如此确定的部分依赖是 X -> Y,而不是 S -> Y。
(参见这个答案。)
我可以证明3NF。 上面 Mike 给出了同时取 CK -> AB 和 BC 的原因 所以,现在
(A,B,C) 是主要属性 (P.A)(即密钥的一部分)
&
只有 D 是非素数属性 (N.P.A)(即不是密钥的一部分)
检查 2NF。不应该有任何 P.A --> N.P.A(即部分 F.D)
1)AB -> D (Key --> N.P.A)
2)CB -> D (Key --> N.P.A)
3)A-> C (P.A --> P.A)
4)C -> A (P.A --> P.A)
所以,这是 2NF。
检查 3NF。不应该有任何 N.P.A --> N.P.A (即传递 F.D)
1)AB -> D (Key --> N.P.A)
2)CB -> D (Key --> N.P.A)
3)A-> C (P.A --> P.A)
4)C -> A (P.A --> P.A)
所以,这是在 3NF 中
检查 BCNF。不应该有任何 P.A --> P.A (即仅 LHS 键允许)
1)AB -> D (Key --> N.P.A) ok
2)CB -> D (Key --> N.P.A) ok
3)A-> C (P.A --> P.A) not a key
4)C -> A (P.A --> P.A) not a key
所以,这不是 BCNF
所以,最高确实是3NF。