模式的规范化用于数据库的设计过程中。一个好的数据库应该没有冗余、查询效率较高,其检验标准就是看数据库是否符合范式(normal forms,NF)。范式可分为第一范式、第二范式和第三范式。在这三个范式中,以第一范式的要求为最低,第三范式的要求为最高。
第一范式(1NF)规定了表中任意字段的值必须是不可分的,即每个记录的每个字段中只能包含一个数据,不能将两个或两个以上的数据“挤入”到一个字段中。例如,假设部分系办公室有两个电话号码,则表1.9是错误的。如果一些系确实需要两个电话,可以再增加一个字段保存第二个电话号码,如表1.10所示。注意两个电话号码的字段名不能相同。
表1.9 有错误的“系”表 表1.10 修改后的“系”表
系编号 |
系 名 |
电 话 |
|
系编号 |
系 名 |
电话1 |
电话2 |
D01 |
计算机系 |
34358750、34358751 |
|
D01 |
计算机系 |
34358750 |
34358751 |
D02 |
社科系 |
76853212 |
|
D02 |
社科系 |
76853212 |
|
D03 |
生物系 |
86238931、13922449900 |
|
D03 |
生物系 |
86238931 |
13922449900 |
仅仅满足第一范式是不够的,当一个表中所有非主键字段完全依赖于主键字段时,称该表满足第二范式(2NF)。观察表1.11所示的工作量表。
表1.11 出现数据冗余的“工作量”表
职工号 |
工地编号 |
名 称 |
位 置 |
造价/万元 |
工作量 |
M01 |
HK03 |
临江花园 |
虹口 |
1500 |
80 |
M01 |
PT17 |
兰亭小区 |
普陀 |
1800 |
73 |
M02 |
HK03 |
临江花园 |
虹口 |
1500 |
103 |
M02 |
ZB21 |
桃源新苑 |
闸北 |
2100 |
98 |
M02 |
PT17 |
兰亭小区 |
普陀 |
1800 |
82 |
“工作量“表的主键由两个字段组合而成,表中的“名称”字段与“职工号”无关,它只依赖于“工地编号”,而不是依赖于主键“职工号+工地编号”,因此该表不符合第二范式的要求。可以想象,如果“临江花园”工地需要100名职工,则该数据将在表中出现100次,这是不该出现的数据冗余。解决这类问题的办法是将该表分解成“工作量”表与“工地”表,使得两个表中的非主键字段依赖各自的主键“职工号+工地编号”和“工地编号”,如表1.12和表1.13所示。
表1.12 “工作量”表
职工号 |
工地编号 |
工作量 |
|
|
|
|
|
|
M01 |
HK03 |
80 |
|
|
表1.13 “工地”表 |
|||
M01 |
PT17 |
73 |
|
|
工地编号 |
名称 |
位置 |
造价/万元 |
M02 |
HK03 |
103 |
|
|
HK03 |
临江花园 |
虹口 |
1500 |
M02 |
ZB21 |
98 |
|
|
PT17 |
兰亭小区 |
普陀 |
1800 |
M02 |
PT17 |
82 |
|
|
ZB21 |
桃源新苑 |
闸北 |
2100 |
当一个表的主键是由两个或两个以上字段组合而成的复合主键时,要特别注意该表是否满足第二范式。
在满足第二范式的前提下,如果一个表的所有非主键字段均不传递依赖于主键,称该表满足第三范式。
假设表中有A、B、C三个字段,所谓传递依赖是指表中B字段依赖于主键A字段,而C字段依赖于B字段,称字段C传递依赖于字段A,这种情况应该避免。观察表1.14所示的“导师”表。
表1.14 有传递依赖的“导师”表
导师编号 |
姓 名 |
性 别 |
职 称 |
系编号 |
系 名 |
电 话 |
101 |
陈平林 |
男 |
教授 |
D02 |
社科系 |
76853212 |
102 |
李向明 |
男 |
副教授 |
D01 |
计算机系 |
34358750 |
103 |
马大可 |
女 |
研究员 |
D03 |
生物系 |
86238931 |
104 |
李小严 |
女 |
副教授 |
D02 |
社科系 |
76853212 |
“导师”表的主键是“导师编号”,“系编号”等非主键字段均依赖于它,但“系名”和“电话”字段却与“导师编号”无关,而仅仅依赖于“系编号”,从而形成传递依赖,造成系名和电话数据的重复。解决方法是将该表分解成“导师”表与“系”表,如表1.15和表1.16所示。
表1.15 “导师”表
导师编号 |
姓 名 |
性 别 |
职 称 |
系编号 |
|
|
表1.16 “系”表 |
||
101 |
陈平林 |
男 |
教授 |
D02 |
|
|
系编号 |
系 名 |
电 话 |
102 |
李向明 |
男 |
副教授 |
D01 |
|
|
D01 |
计算机系 |
34358750 |
103 |
马大可 |
女 |
研究员 |
D03 |
|
|
D02 |
社科系 |
76853212 |
104 |
李小严 |
女 |
副教授 |
D02 |
|
|
D03 |
生物系 |
86238931 |