当通过两个键关系包含部分函数依赖时,这怎么可能是 3NF?

问题描述 投票:0回答:3

关系模式:

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。为什么?

database database-normalization functional-dependencies 3nf
3个回答
2
投票

创建表时AB和BC不能作为主键。 那么我们就一一来吧

不。你可以一一考虑它们,但你必须考虑每一个候选键。关系模型没有为将一个候选键标记为“主要”提供理论依据。在 SQL 数据库中可能有很好的实际理由,但仅在关系模型中没有理论依据。

“部分函数依赖”的概念适用于非素数属性。唯一的非素数属性是 D。这里没有部分依赖。


1
投票
  1. 根据阿姆斯特朗公理,当某些 FD 成立时,其他 FD 也必须成立。但你只看给定的 FD。

  2. “部分FD”不是根据CK(候选密钥)定义的。 2NF 根据部分 FD 和 CK 进行定义。当任何 CK 上不存在非素数属性的部分 FD 时,2NF 成立。当没有部分 FD 时则不会。

  3. PK(主键)是不相关的。 PK 只是您决定称之为“PK”的某个 CK。

  4. 当 Y 在功能上依赖于 X 的较小/适当的子集 S 时,Y 在功能上部分依赖于 X。但是如此确定的部分依赖是 X -> Y,而不是 S -> Y。

(参见这个答案。)


0
投票

我可以证明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。

© www.soinside.com 2019 - 2024. All rights reserved.