将数据库规范化为 3NF 的正确方法
The right way to normalize database into 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 是键属性,所以没关系。
我的标准化是否正确?
您输入的数据有问题。如果关系 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的算法,数据库方面的好书都可以找到
我有这个数据库:
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 是键属性,所以没关系。
我的标准化是否正确?
您输入的数据有问题。如果关系 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的算法,数据库方面的好书都可以找到