在设计与操做维护数据库时,最关键的问题就是要确保数据可以正确地分布到数据库的表中。使用正确的数据结构,不只有助于对数据库进行相应的存取操做,还能够极大地简化应用程序中的其余内容(查询、窗体、报表、代码等),按照“数据库规范化”对表进行设计,其目的就是减小数据库中的数据冗余,以增长数据的一致性。数据库
泛化时在识别数据库中的一个数据元素、关系以及定义所需的表和各表中的项目这些初始工做以后的一个细化的过程。常见的范式有1NF、2NF、3NF、BCNF以及4NF。下面对这几种常见的范式进行简要分析。数据结构
一、1NF(第一范式)函数
第一范式是指数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。设计
若是出现重复的属性,就可能须要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。第一范式的模式要求属性值不可再分裂成更小部分,即属性项不能是属性组合或是由一组属性构成。blog
简而言之,第一范式就是无重复的列。例如,由“职工号”“姓名”“电话号码”组成的表(一我的可能有一部办公电话和一部移动电话),这时将其规范化为1NF能够将电话号码分为“办公电话”和“移动电话”两个属性,即职工(职工号,姓名,办公电话,移动电话)。class
二、2NF(第二范式)基础
第二范式(2NF)是在第一范式(1NF)的基础上创建起来的,即知足第二范式(2NF)必须先知足第一范式(1NF)。第二范式(2NF)要求数据库表中的每一个实例或行必须能够被惟一地区分。为实现区分一般须要为表加上一个列,以存储各个实例的惟一标识。程序
若是关系模型R为第一范式,而且R中的每个非主属性彻底函数依赖于R的某个候选键,则称R为第二范式模式(若是A是关系模式R的候选键的一个属性,则称A是R的主属性,不然称A是R的非主属性)。im
例如,在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),但因为非主属性学分仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是彻底依赖,所以此种方式会致使数据冗余以及更新异常等问题,解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分),新关系经过学生表中的外关键字课程号联系,在须要时进行链接。数据
三、3NF(第三范式)
若是关系模型R是第二范式,且每一个非主属性都不传递依赖于R的候选键,则称R是第三范式的模式。
以学生表(学号,姓名,课程号,成绩)为例,其中学生姓名无重名,因此该表有两个候选码(学号,课程号)和(姓名,课程号),故存在函数依赖:学号——>姓名,(学号,课程号)——>成绩,惟一的非主属性成绩对码不存在部分依赖,也不存在传递依赖,因此属性属于第三范式。
四、BCNF(BC范式)
它构建在第三范式的基础上,若是关系模型R是第一范式,且每一个属性都不传递依赖于R的候选键,那么称R为BCNF的模式。
假设仓库管理关系表(仓库号,存储物品号,管理员号,数量),知足一个管理员只在一个仓库工做;一个仓库能够存储多种物品,则存在以下关系:
(仓库号,存储物品号)——>(管理员号,数量)
(管理员号,存储物品号)——>(仓库号,数量)
因此,(仓库号,存储物品号)和(管理员号,存储物品号)都是仓库管理关系表的候选码,表中惟一非关键字段为数量,它是符合第三范式的。可是,因为存在以下决定关系:
(仓库号)——>(管理员号)
(管理员号)——>(仓库号)
即存在关键字段决定关键字段的状况,所以其不符合BCNF。把仓库管理关系表分解为两个关系表仓库管理表(仓库号,管理员号)和仓库表(仓库号,存储物品号,数量),这样这个数据库表是符合BCNF的,并消除了删除异常、插入异常和更新异常。
五、4NF(第四范式)
设R是一个关系模型,D是R上的多值依赖集合。若是D中存在凡多值依赖X->Y时,X必是R的超键,那么称R是第四范式的模式。
例如,职工表(职工编号,职工孩子姓名,职工选修课程),在这个表中,同一个职工可能会有多个职工孩子姓名,一样,同一个职工也可能会有多个职工选修课程,即这里存在着多值事实,不符合第四范式。若是要符合第四范式,只须要将上表分为两个表,使它们只有一个多值事实,例如职工表一(职工编号,职工孩子姓名),职工表二(职工编号,职工选修课程),两个表都只有一个多值事实,因此符合第四范式。
拓展:各范式的关系图以下所示: