定义:符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度。
关系模式的范式主要有4种,即第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF范式。满足这些范式条件的关系模式可以在不同程度上避免冗余问题、插入问题、更新问题和删除问题。
符合高一级范式的设计,必定符合第一级范式。如符合2NF,必定符合1NF。
把一个给定关系模式转化为某种范式的过程称为关系范式的规范化过程,简称规范化。
- 第一范式(1NF)
关系模式R中每个属性的值域都是不可分的简单数据项的集合,则称这个关系模式为第一范式关系模式1NF。
在任何一个关系数据库系统中,第一范式都是一个最基本的要求。
- 第二范式(2NF)
定义:关系模式R是1NF的前提下,每一个非主键属性都完全函数地依赖于R的键,则R成为第二范式关系模式2NF。
例如,关系模式TaobaoPucharsedLog(s_id#, date, buyer_id#, buyer_name, buyer_age, seller_id#, seller_age, goods_id#, goods_name, amount), 其中的键为s_id, buyer_id, seller_id, goods_id四个。就其中的 seller_name
属性来说,它仅仅依赖于键 seller_id
, 和其他键没有关系,即非主键属性 seller_name
部分地依赖于键{s_id#, buyer_id#, seller_id#, goods_id#},因此TaobaoPucharsedLog关系不符合2NF定义,不是2NF,这将导致三个问题:
(1)插入异常。插入时必须给定键值,如果键值的一部分为空,则导致数据无法插入。
(2)删除异常。删除某个信息,整个元组就不能存在了,也必须跟着删除,从而丢失了其他信息,产生了删除异常,即不应删除的信息也删除了。
(3)修改复杂。如果一个商品被购买了k次,goods_name
就得重复存储k次,存储冗余大。此外,当数据更新时必须毫无遗漏地修改k条记录中全部goods_name
信息,造成修改的复杂化。
- 第三范式(3NF)
--
定义:如果关系模式是2NF,而且它的任意一个非键属性都不传递地依赖于任何候选键,则R成为第三范式关系模式3NF。
意思就是说,不得存在传递式依赖,比如对于一个数据库,里面的元素有son, person, father, grand_father,依赖关系是son->person
, person->father
, father->grand_father
, 明显有一个链式的传递,而3NF中禁止此类依赖的出现。
解决方式是将依赖关系分解,分解后的关系模式中不再存在传递依赖:
son->person
son->father
son->grand_father
满足于3NF的依赖,可以避免查询路径过长导致询问时间过长或更新异常。对于上面的例子来说,想查询某个son的grandgrandgrand....father是谁,按照非3NF的依赖需要进行多次查询,而3NF只需要进行一次查询,效率大大提高。
- BCNF范式(Boyce Codd Normal Form)
--
BCNF是由Boyce和Codd提出来的,比3NF更进一步。通常认为BCNF是增强的3NF,有时也直接被成为3NF。
定义:设关系模式R是1NF。如果对于R的每个函数依赖X->Y,X必为候选键,则R是BCNF范式。
BCNF是比第三范式更严格的一个范式,它要求关系模型中所有的属性(包括非键属性和键属性)都不传递地依赖于任何候选键。也就是说:
(1)所有非键属性都完全函数依赖于每个候选键。
(2)所有键属性都完全函数依赖于每个不包含它的候选键。
(3)没有任何属性完全函数依赖于非键的任何一组属性。
例如:在关系模式SJP(S, J, P)中,S学生,J课程,P名次。每个学生每门课程都有一个确定的名次,每门课程每一名次都只有一个学生。可以得到函数依赖:{S,J}->P和{J,P}->S。显然,{S,J}与{J,P}都是候选键。这两个候选键各由两个属性组成,而且相交。这个关系模式中显然没有属性对候选键的传递依赖或部分依赖,SJP是3NF,同时也是BCNF。
参考文献
[1] 李建中 王珊.数据库系统原理(第二版).电子工业出版社.2004