过去我设计的数据库产品虽然可以使用,但是都是很不科学的数据库,大量存在数据冗余,或者管理不方便。在大学的课程中我终于明白一个比较科学的数据库设计需要满足些什么标准,这就是每个数据库的设计都必须满足三大范式的要求。
1.三大范式的内容
第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。
第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF.
第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
2.关系的分解
符合3NF规范标准的关系模式就会有比较好的性质,不会出现数据冗余,数据不一致或插入,删除异常等情况。3NF分解的步骤大致如下:
(1)如果R不满足1NF条件,先对其分解,使其满足1NF。对R进行第一范式分解的方法是直接将其复合属性进行分解,用分解后的基本属性集取代原来的属性,以获得1NF。
(2)R符合1NF条件但符合第二范式条件时,分解R使其满足2NF。
假设R=(S1,S2,X1,X2)
PrimaryKey(S1,S2)(S1,S2)作为关键字
S1->X1
以上是一个典型的不满足第二范式的例子,可以分解为R1,R2
R1=(S1,S2,X1)
Primarykey(S1,S2)R1以(S1,S2)作为关键字
R2=(S1,X1)
Primarykey(S1)R2以(S1)作为关键字
如果R1,R2还不满足2NF条件,可以继续上述分解过程,直到每个分解后的关系模式都满足要求为止。
(3)对于R满足2NF不满足3NF条件,说明R中的所有非主属性对R中的任何候选关键字都是完全函数依赖的,但至少存在一个属性是传递函数依赖的。因此,存在R中的非主属性间的依赖作为传递依赖的过渡属性。
假设R=(S1,X1,X2)
PrimaryKey(S1)S1作为关键字
X1->X2X2通过非主属性X1传递依赖于S
以上就是典型的不满足第二范式的例子,可以分解为R1,R2
R1=(S1,X1)
PrimaryKey(S1)R1以S1为关键字
ForeignKey(X1)R1以X1为外键
R2=(X1,X2)
PrimaryKey(X1)R2以X1为关键字
如果R1,R2还不满足3NF,可以重复上述过程,直到符合3NF条件为止。