1.4 模式的规范化
模式的规范化用于数据库的设计过程中,一个好的数据库应该冗余尽可能少、查询效率较高,其检验标准就是看数据库是否符合范式(Normal Forms,NF)。范式可分为第一范式、第二范式和第三范式等。在这3个范式中,以第一范式的要求为最低,第三范式的要求为最高。一般的商业数据库在设计时达到第三范式即可满足要求。
1.4.1 第一范式
第一范式(1NF)规定了表中任意字段的值必须是不可分的,即每个记录的每个字段中只能包含一个数据,不能将两个或两个以上的数据“挤入”到一个字段中。例如,假设部分系办公室有两个电话号码,则表1-9是错误的。如果一些系确实需要两个电话,可以再增加一个字段保存第二个电话号码,如表1-10所示。注意两个电话号码的字段名不能相同。
表1-9 有错误的“系”表
表1-10 修改后的“系”表
1.4.2 第二范式
在满足第一范式的基础上,如果一个表的所有非主键字段完全依赖于主键字段时,则称该表满足第二范式(2NF)。请观察表1-11所示的“工作量”表。
表1-11 出现数据冗余的“工作量”表
“工作量”表的主键由两个字段组合而成(“职工号+工地编号”),表中的“名称”字段与“职工号”无关,它只依赖于“工地编号”,而不是完全依赖于主键“职工号+工地编号”,因此该表不符合第二范式的要求。可以想象如果“临江花园”工地需要100名职工,则该数据将在表中出现100次,这是不该出现的数据冗余。解决这类问题的办法是将该表分解成“工作量”表与“工地”表,使得两个表中的非主键字段完全依赖各自的主键“职工号+工地编号”和“工地编号”,如表1-12和表1-13所示。
表1-12 “工作量”表
表1-13 “工地”表
当一个表的主键是由两个或两个以上字段组合而成的复合主键时,要特别注意该表是否满足第二范式。
1.4.3 第三范式
在满足第二范式的前提下,如果一个表的所有非主键字段均不传递依赖于主键,称该表满足第三范式。
假设表中有A、B、C三个字段,所谓传递依赖是指如果表中B字段依赖于主键A字段,而C字段又依赖于B字段,则称字段C传递依赖于A字段,这种情况应该避免。观察表1-14所示的“导师”表。
表1-14 有传递依赖的“导师”表
“导师”表的主键是“导师编号”,“系编号”等非主键字段均依赖于它,但“系名”和“电话”字段却与“导师编号”无关,而仅仅依赖于“系编号”,从而形成传递依赖,造成系名和电话数据的重复。解决方法是将该表分解成“导师”表与“系”表,如表1-15和表1-16所示。
表1-15 “导师”表
表1-16 “系”表