关系模型满足的确定约束条件称为范式,根据满足约束条件的级别不同,范式由低到高分为1NF(第一范式)、2NF(第二范式)、3NF(第三范式)、BCNF(BC范式)、4NF(第四范式)等。不同的级别范式性质不同。
把一个低一级的关系模型分解为高一级关系模型的过程,称为关系模型的规范化。关系模型分解必须遵守两个准则。
(1)无损连接性:信息不失真(不增减信息)。
(2)函数依赖保持性:不破坏属性间存在的依赖关系。
规范化的基本思想是逐步消除不合适的函数依赖,使数据库中的各个关系模型达到某种程度的分离。规范化解决的主要是单个实体的质量问题,是对于问题域中原始数据展现的正规化处理。
规范化理论给出了判断关系模型优劣的理论标准,帮助预测模式可能出现的问题,是数据库逻辑设计的指南和工具,具体有:
(1)用数据依赖的概念分析和表示各数据项之间的关系。
(2)消除E-R图中的冗余联系。
通俗地说,就像自变量x确定之后,相应的函数值f(x)也就唯一确定了一样,函数依赖是衡量和调整数据规范化的最基础的理论依据。
例如,记录职工信息的结构如下:
职工工号(EMP_NO)
职工姓名(EMP_NMAE)
所在部门(DEPT)。
则说EMP_NO函数决定EMP_NMAE和DEPT,或者说EMP_NMAE,DEPT函数依赖于EMP_NO,记为:EMP_NO→EMP_NMAE,EMP_NO→DEPT。
关系R<U,F>中的一个属性或一组属性K,如果给定一个K则唯一决定U中的一个元组,也就是U函数完全依赖于K,就称K为R的码。一个关系可能有多个码,选中其中一个作为主码。
包含在任一码中的属性称为主属性,不包含在任何码中的属性称为非主属性。
关系R中的属性或属性组X不是R的码,但X是另一个关系模型的码,称X是R的外码。
主码和外码是一种表示关系间关联的重要手段。数据库设计中一个重要的任务就是要找到问题域中正确的关联关系,孤立的关系模型很难描述清楚业务逻辑。
1NF是最低的规范化要求。如果关系R中所有属性的值域都是简单域,其元素(即属性)不可再分,是属性项而不是属性组,那么关系模型R是第一范式的,记作R∈1NF。这一限制是关系的基本性质,所以任何关系都必须满足第一范式。第一范式是在实际数据库设计中必须先达到的,通常称为数据元素的结构化。
例如,表2-1所示的结构就不满足1NF的定义。
表2-1 不满足1NF的结构
表2-1为非第一范式,分解如表2-2所示。
表2-2 满足1NF的结构
这就满足了第一范式。经过处理后,就可以以省、市为条件进行查询和统计了。
满足1NF的关系模型会有许多重复值,并且增加了修改其数据时引起疏漏的可能性。为了消除这种数据冗余和避免更新数据的遗漏,需要更加规范的2NF。
如果一个关系R属于1NF,且所有的非主属性都完全地依赖于主属性,则称之为第二范式,记作R∈2NF。
为了说明问题,现举一个例子来说明:
有一个获得专业技术证书的人员情况登记表结构为:
省份、姓名、证书名称、证书编号、核准项目、发证部门、发证日期、有效期。
这个结构符合1NF,其中“证书名称”和“证书编号”是主码,但是因为“发证部门”只完全依赖于“证书名称”,即只依赖于主关键字的一部分(即部分依赖),所以它不符合2NF,这样首先存在数据冗余,因为证书种类可能不多。其次,在更改发证部门时,如果漏改了某一记录,存在数据不一致。再次,如果获得某种证书的职工全部跳槽了,那么这个发证部门的信息就可能丢失了,即这种关系不允许存在某种证书没有获得者的情况。
可以用分解的方法消除部分依赖的情况,而使关系达到2NF的标准。方法是,从现有关系中分解出新的关系表,使每个表中所有的非关键字都完全依赖于各自的主关键字。可以分解成两个表(省份、姓名、证书名称、证书编号、核准项目、发证日期、有效期)和(证书名称、发证部门),这样就完全符合2NF了。
如果一个关系R属于2NF,且每个非主属性不传递依赖于主属性,这种关系是3NF,记作R∈3NF。
从2NF中消除传递依赖,就是3NF。例如,有一个表(职工姓名,工资级别,工资额),其中职工姓名是关键字,此关系符合2NF,但是因为工资级别决定工资额,也就是说非主属性“工资额”传递依赖于主属性“职工姓名”,它不符合3NF,同样可以使用投影分解的办法分解成两个表:(职工姓名,工资级别),(工资级别,工资额)。
一般满足3NF的关系模型已能消除冗余和各种异常现象,获得比较满意的效果,但无论2NF还是3NF都没有涉及主属性间的函数依赖,所以有时仍会引起一些问题。由此引入BC范式(由Boyeet和Codd提出)。通常认为BCNF是第三范式的改进。
BC范式的定义:如果关系模型R∈1NF,且R中每一个函数依赖关系中的决定因素都包含码,则R是满足BC范式的关系,记作R∈BCNF。
当一个关系模型R∈BCNF,则在函数依赖范畴里,就认为已彻底实现了分离,消除了插入、删除的异常。
综合1NF、2NF和3NF、BCNF的内涵可概括如下:
(1)非主属性完全函数依赖于码(2NF的要求);
(2)非主属性不传递依赖于任何一个候选码(3NF的要求);
(3)主属性对不含它的码完全函数依赖(BCNF的要求);
(4)没有属性完全函数依赖于一组非主属性(BCNF的要求)。