设计关系数据库时,需遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。一般说来,数据库只需满足第三范式就行了,所以此文仅说说我对这三个范式的理解。
第一范式(1NF)
数据库表中每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。
像上面这种情况就不符合第一范式,正确的应该为:
第二范式(2NF)
要求实体的属性完全依赖于主关键字,完全依赖是指不能存在仅依赖主关键字一部分的属性(主要针对联合主键而言)。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示:
订单信息表
这样就产生了一个问题:表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关,违反了第二范式的设计原则,应该将这个表拆分为三个相关的表。
订单信息表:
订单项目表:
商品信息表:
第三范式(3NF)
确保数据表中每一列数据都和主键直接相关,而不能间接相关。
有表Student(学号,姓名,年龄,性别,系别,系办地址、系办电话),关键字为单一关键字"学号",存在如下决定关系:
(学号)→(姓名,年龄,性别,系别,系办地址、系办电话)
但是还存在下面的决定关系:
(学号) → (所在系办)→(系办地点,系办电话)
即存在非关键字段"系办地点"、"系办电话"对关键字段"学号"的传递函数依赖。
这样是不满足第三范式的,把学生关系表分为如下两个表就可以了:
学生:(学号,姓名,年龄,性别,系别)
系别:(系别,系办地址、系办电话)