将数据库规范化为3NF的正确方法

时间:2016-05-02 10:57:28

标签: sql database-normalization 3nf

我有这个数据库:

R(A, B, C, D, E)
Keys: A
F = {A -> B, D -> E, C -> D}

我将它标准化为3NF,如下所示:

R(A, B, C, D, E)
Keys: AD
F = {AD -> B, AD -> E, C -> D}

我做的是当我检查D - > E,D不是超级密钥,E不是关键属性,因此我将D和A视为超级密钥{AD}。当我检查C - > D,C不是键,但D是关键属性,所以没关系。

我的规范化是否正确?

1 个答案:

答案 0 :(得分:1)

输入数据存在问题。如果关系R具有依赖关系F = {A -> B, D -> E, C -> D},则A 不能是关键。实际上,键是一组属性,其闭包决定了关系的所有属性,这不是这里的情况,因为:

A+ = AB

F开始,(唯一)可能的密钥为AC,实际上是

AC+ = ABCD

归一化意味着通过分解在功能依赖性不违反正常形式的其他关系中的关系来减少冗余,并且使得加入分解的关系,可以获得原始关系。

在您的解决方案中,您不会分解关系,而只会更改与第一个集合未暗示的其他依赖关系的依赖关系集。

正确的分解将取代以下内容:

R1 < (A B) ,
{ A → B } >

R2 < (C D) ,
{ C → D } >

R3 < (D E) ,
{ D → E } >

R4 < (A C) ,
{ } >

将关系分解为3NF的算法可以在任何关于数据库的好书中找到。