数据库三范式
第一范式(1NF)
是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值,或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系,在第一范式中表的每一行只包含一个实例的信息。
简而言之,第一范式就是无重复的列。
指导原则:
1、数组的每个属性只能包含一个值。
2、关系中的每个数组必须包含相同数量的值。
3、关系中的每个数组一定不能相同。
例如:如上图不符合第一范式,转化为符合第一范式:
第二范式(2NF)
必须先满足第一范式。
要求数据库表中的每个实例或行,必须可以被唯一地区分,就是要求每一个非主键字段的数值,都依赖于该数据表的主键字段。
就是要求实体的属性完全依赖于主关键字,所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
简而言之,第二范式就是非主属性非部分(也就是全部)依赖于主关键字。
例如:下图的项目计划表,其中的主键是项目编号,而其中的负责人部门列是不依赖于该主键的,负责人部门依赖的是负责人列,而第二范式的要求是非主键字段,都必须完全依赖于主键字段,所以,把项目计划表拆分出来一个部门数据表。
第三范式(3NF)
必须先满足第二范式。
1、要求一个数据库表中不包含已在其它表中,包含的非主关键字信息。
2、该数据表中的任何两个非主键字段的数值之间,不存在函数依赖关系。
简而言之,第三范式就是属性不依赖于其它非主属性。
例如:在机房收费系统中:
日结账单和周结账单数据表中的非主键字段的信息重复(非主键字段基本上完全一样),在正在上机数据表和上下机数据表中也存在重复的非主键字段信息(比如上机日期,上机时间等等),在查询正在值班教师和工作日志数据表中的非主键字段也存在重复的信息(比如,登录的日期,登录时间和计算机机号等等),所以,可以通过合并这些数据表,来去掉一个数据表中,已在其它表中包含的非主键信息。
在学生信息数据表中,非主键字段之间存在函数依赖关系,比如:卡号和注册日期、注册时间等等,这里就需要新建一个卡号数据表,从而符合第三范式。
例如:如下的员工数据表:
其中的工资和奖金列之间存在函数依赖关系,奖金是工资的十分之一,通过工资就可以计算出奖金,因此,不符合第三范式,需要把奖金列去掉以符合第三范式。