:关系模子满足简直定束缚前提,按照满足束缚前提的级别分歧,范式由低到高分为1NF(第一范式)、2NF(第二范式)、3NF(第三范式)、BCNF(BC范式)、4NF(第四范式)等。分歧的级别范式性质也分歧。
把一个低一级的关系模子分化为高一级关系模子的过程,称为关系模子的规范化。关系模子分化必需恪守两个原则:
规范化的根基思惟是逐渐消弭不合适的函数依赖,使数据库中的各个关系模子达到某种程度的分手。规范化处理的次要是单个实体的质量问题,是对于问题域华夏始数据展示的正轨化处置。规范化理论给出了判断关系模子好坏的理论尺度,协助预测模式可能呈现的问题,是数据库设想的指南和东西,具体有:
函数依赖:通俗的说,就像自变量x确定之后,响应的函数值f(x)也就独一确定了一样,函数依赖是权衡和调整数据规范化的最根本的理论根据。例如,记实职工消息的布局如下:
职工工号(EMP_NO)、职工姓名(EMP_NAME)、地点部分(DEPT)。
1NF是最低的规范化要求。若是关系R中所有的属性的值域都是简单域,其元素(即属性)不成再分,是属性项而不是属性组,那么关系模子R是第一范式的,记作RÎ1NF。这一限制是关系的根基性质,所以任何干系都必需满足第一范式。第一范式是现实数据库设想中必需先达到的,凡是称为数据元素的布局化。如下图1,不满足1NF的例子和图2满足1NF的例子:
颠末处置后,就能够以省、市为前提进行查询和统计了。满足1NF的关系模子会呈现良多反复值,数据库系统概念而且添加了点窜其数据时惹起疏漏的可能性。为了消弭这种数据冗余和避免更新数据的脱漏,需要添加愈加规范的2NF。
2NF:若是一个关系R属于1NF,且所有的非主属性都完全依赖于主属性,则称为第二范式,记作RÎ2NF。
为了申明问题,用一个例子申明:有一个获得专业手艺证书的人员环境登记表布局如下:
这个布局合适1NF,此中“证书名称”和“证书编号”是主码,可是“发证部分”只完全依赖于“证书名称”,即只依赖于主环节字的一部门(即部门依赖),所以它不合适2NF,如许起首具有数据冗余,由于证书的品种可能不多。其次,在更改发证部分的时候,若是漏改了某一记实,具有数据不分歧。再次,若是获得某种证书的职工全数跳槽了,那这个发证部分的消息就可能丢失了,即这种关系不答应具有某种证书没有获得者的环境。
能够用分化的方式消弭部门依赖的环境,而使关系达到2NF的尺度。方式是:从现相关系平分解出新的关系表,使得每个表中所有的非环节字都完全依赖于各自的主环节字。能够分化成两个表(省份、姓名、证书名称、证书编号、核准项目、发证日期、无效期)和(证书名称、发证部分),如许就完全合适2NF了。
3NF:若是一个关系属于2NF,且每个非主属性不传送依赖于主属性,这种关系称为3NF,记作RÎ3NF。
从2NF中消弭传送依赖,就是3NF。例如:有一个表(职工姓名,工资级别,工资额),此中职工姓名是环节字,此关系合适2NF,可是由于工资级别决定工资额,也就是说非主属性“工资额”传送依赖于主属性“职工姓名”,它不合适3NF,同样能够利用投影分化的方式分化成两个表:(职工姓名,工资级别)和(工资级别,工资额)。
一般满足3NF的关系模子曾经消弭冗余和各类非常现象,获得比力对劲的结果。但无论是2NF仍是3NF都没有涉及主属性间的函数依赖,所以仍是会有时惹起一些问题。由此引入BC范式(由Boyeet和Codd提出)。凡是认为BCNF是3NF的改良。
BC范式的定义:若是关系模子R∈1NF,且R中每一个函数依赖关系中的决定要素都包含码,则R是满足BC范式的关系,记作RÎBCNF。当一个关系模子RÎBCNF,则在函数依赖范围里,就认为曾经完全实现了分手,消弭了插入、删除的非常。
数据库中的规范化的长处是削减了数据冗余,节约了存储空间,响应的逻辑和物理的I/O次数削减,同时加速了添加、删除、点窜的速度,可是对完全规范的数据库进行查询的时候,凡是需要更多的毗连操作,从而影响查询的效率。因而,有时为了提高某些查询或使用的机能而粉碎规范化法则,即反规范化(非规范化处置)。
添加冗余列是指在多个表中具有不异的列,它常用来在查询时避免毗连操作。例如:以规范化设想理念,学生成就表中不需要“姓名”,由于“姓名”字段可通过学号查询到,但在反规范化设想中,会将“姓名”字段插手表中。如许查询一个学生的成就时,不需要与学生表进行毗连操作,便能够获得对应的“姓名”。
添加派生列是指添加的列能够通过表中的其他数据计较生成。它的感化是在查询时削减计较量,从而加速查询速度。例如:订单表中,有商品号,商品单价,采购数量,我们需要订单总价时,能够通过计较获得总价,所以规范化设想理念是不消在订单表中设想“订单总价”字段的。但范规范化就不如许考虑,因为订单总价在每次查询都需要计较,如许会占用系统大量资本,所以在此表中添加了派生列“订单总价”以提高查询效率。
程度朋分:按照一列或多列数据的值把数据行放到两个独立的表中。程度朋分凡是鄙人面的环境下利用:
垂直朋分:把主码和一些列放到一个表,然后把主码和别的一些列放到另一个表中。若是一些表中的某些列常用,而别的一些列不常用,则能够采用垂直朋分,别的垂直朋分能够使得数据行变小,一个数据页就能存储更多的数据,在查询时会削减I/O次数。其错误谬误是需要办理冗余列,查询所无数据需要毗连操作。