2NF和3NF标准化

时间:2015-12-13 23:14:14

标签: database normalization

在进行规范化问题时,我似乎遇到了一个奇怪的问题。当我与实际名字发表关系时,我可以很容易地解决这些问题,但是当我收到信件时,这似乎要困难得多。

对于以下问题,我不知道为什么它不是3NF,为什么它是2NF。

给定R(A,B,C,D,E,F)

FDs = {AB-> C,DBE-> A,BC-> D,BE-> F,F-> D}

因此,对于2NF,所有右侧属性必须在功能上完全依赖于左侧属性。对于3NF,要么所有左侧属性都必须是超级键,要么右侧属性必须是主要属性。

我试着把它画出去,但我甚至找不到候选钥匙。任何人都可以帮我确定为什么这不是3NF?另外,这里的候选键是什么?因为我没有看到任何具有与原始关系相等的闭包的属性。

1 个答案:

答案 0 :(得分:0)

  

在进行规范化问题时,我似乎遇到了一个奇怪的问题。   当我与实际名字发表关系时,我可以想出这些   很容易,但当我收到信件时,似乎要困难得多。

是的,字母不太直观。我会告诉你一个简洁的方法,你可以在这种情况下确定候选键:

留下三列( L ),中间( M )和右列( R ),其中左列包含所有属性在所有给定的功能依赖项中仅出现在左侧。在我们的例子中,这些属性将是BE,因为它们总是在任何给定的FD的左侧(或者你可以说它们在任何给定的FD中都不在右侧)。 。类似地,中间列包含出现在给定FD的左侧和右侧的属性。因此,我们在中间列中有ACDF。右列包含仅出现在FD右侧的属性(从不在任何给定FD的LHS上)。所以我们有:

L  |   M   |R
B,E|A,C,D,F|-

现在你有了这个表,记住以下规则:(这些非常直观

  • 左侧( L )列中的属性始终是候选键的一部分
  • 右侧( R )列中的属性从不是候选键的一部分
  • 中间( M )列中的属性可能会也可能不会成为候选键的一部分。

因此,在我们的案例中,我们首先检查BE是否是候选键。我们发现BE-closure由关系R的所有属性组成,因此它是候选键。 (注意:如果BE不是候选键,那么我们将从中间(M)列逐个获取属性并将其与BE组合并检查其闭包,例如。{{ 1}},BEABEC ...)

所以现在我们只有一个候选键BED。所以我们的 prime 属性是 {B,E} ,而非素数属性是 {A,C,D,F} < /强>

如果RHS是非素数属性且LHS不是候选键,我们知道3NF 违反了 。鉴于FD是:

  1. AB-&以及c
  2. DBE-&gt;一种
  3. BC-&GT; d
  4. BE-&GT;˚F
  5. F-&GT; d
  6. 我们注意到,所有这些FD的RHS都是非主要属性。因此,在所有这些中,LHS应该是它在3NF中的关键。我们看到(1),(3)和(5)违反了这一点,因此不在3NF 。 (注意:在(2)中我们可以看到LHS上的BE是一个无关的属性,因此其D因此(2)不违反3NF规则