1. 什么是范式(Normal Form,简称NF)?
范式指的是在设计合理的关系型数据库时,需要遵从的不同的规范要求,越高的范式意味着数据库的冗余越小。范式带来的好处:消除重复数据,减少数据冗余,更好地组织数据库内的数据,让磁盘空间得到更有效的利用
。当然,范式也存在如下的缺点:范式使查询变得相当复杂,在查询时需要更多的链接,一些复合索引的列由于范式化的需要被分割到不同的表中,导致索引策略不佳
。
2. 范式中的常用概念
2.1 实体(Entity)
实体指的是实际应用中要用数据描述的事物,它是现实世界中客观存在并可以被区别的事物,一般是名词。比如“一个学生”、“一本书”、“一门课”等。同时,需要注意的是,这里的“事物”不仅仅是看得见摸得着的“东西”,也可以是虚拟的,比如说“老师和学校的关系”。
2.2 数据项(Data Item)
数据项指的是字段(Field),也可以称为域、属性、列,是数据的不可分割的最小单位。数据项通过数据类型(逻辑的、数值的、字符的等)及数据长度来描述实体的某种属性,其包含数据项的名称、编号、别名、简述、数据项的长度、类型、数据项的取值范围等内容。
2.3 数据元素(Data Element)
数据元素是数据的基本单位。数据元素也称为元素、行、元组、记录(Record)。一个数据元素可以由若干个数据项组成,表中的一行就是一个元组。
2.4 码(Key)
码也称为键,是能唯一标识实体的属性,是整个实体集的性质,而不是单个实体的性质。码分为超码、候选码、主码、全码和外码。
1)超码:是一个或多个属性的集合,这些属性的组合可以在一个实体集中唯一的标识一个实体。如果K是一个超码,那么K的任意超集也是超码,也就是说如果K是超码,那么所有包含K的集合也是超码。
2)候选码:在一个超码中,可能包含了无关紧要的属性,如果对于一些超码,他们的任意真子集都不能称为超码,那么这样的最小超码称为候选码。
3)主码:从候选码中挑一个最少键的组合,它就叫主码(主键,Primary Key)。每个主码应该具有下列特征:①唯一的;②最小的(尽量选择最少键的组合);③非空的;④不可更新的(不能随时更改)。
4)全码:如果一个码包含了所有的属性,那这个码就是全码(All-Key)。
5)外码:关系模式R中的一个属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外码(外键,Foreign Key)。比如在SC(Sno, Cno, Grade)中,Sno不是码,但Sno是关系模式S(Sno, Sdept, Sage)的码,则Sno是关系模式SC的外码。
2.5 主属性
一个属性只要在任何一个候选码中出现过,这个属性就是主属性(Prime Attribute)。
2.6 非主属性
与主属性相反,没有在任何候选码中出现过,这个属性就是非主属性(Nonprime Attribute)或非码属性(Non-key Attribute)。
2.7 依赖表(Dependent Table)
依赖表也称为弱实体(Weak Entity),是需要用父表标识的子表。
2.8 关联表(Associative Table)
关联表是多对多关系中两个父表的子表。
2.9 依赖
1)函数依赖:指关系中一个或一组属性的值可以决定其他属性的值。函数依赖不是指关系模式R中的某个或某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件。
2)完全函数依赖:在一个关系中,若某个非主属性数据项依赖于全部关键字称之为完全函数依赖。比如,在成绩表(学号,课程号,成绩)关系中,(学号,课程号)可以决定成绩,但是单一的学号或课程号都不能决定成绩,所以"(学号,课程号) -> 成绩"
就是完全函数依赖。
3)传递函数依赖:指的是如果存在"A -> B -> C"
的决定关系,则C传递函数依赖于A。
3. 第一范式(1NF)
第一范式指在关系模型中,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项。简而言之,第一范式就是无重复的域。
比如,对于职工表(职工号,姓名,电话号码),一个人可能有一个办公电话和一个移动电话,所以其可以规范化为1NF,只需将“电话号码”分为“办公电话”、“移动电话”两个属性,即职工表(职工号,姓名,办公电话,移动电话)。
4. 第二范式(2NF)
第二范式在1NF的基础上,要求每个非主属性必须完全依赖于码(即在1NF基础上消除非主属性对主键的部分函数依赖)。所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
比如,在选课关系表(学号,课程号,成绩,学分)中,码为组合关键字(学号,课程号)。但是,非主属性学分仅仅依赖于课程号,因此对码只是部分依赖而不是完全依赖,所以这样设计就会导致数据冗余、更新异常、插入异常和删除异常等问题,不符合2NF。解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分),新关系通过学生表中的外键(课程号)联系,在需要时通过两个表的连接来取出数据。
5. 第三范式(3NF)
第三范式在1NF基础上,要求每个非主属性既不部分依赖于码也不传递依赖于码(即在2NF基础上消除传递依赖)。第三范式是第二范式的一个子集,即满足第三范式前必须先满足第二范式。
比如,学生表(学号,姓名,课程号,成绩),假设学生姓名无重名,那么该表会有两个候选码(学号,课程号)和(姓名,课程号),则会存在函数依赖:学号 -> 姓名,(学号,课程号)-> 成绩,(姓名,课程号)-> 成绩。唯一的非主属性成绩对码不存在部分依赖,也不存在传递依赖,所以属于第三范式。第三范式的好处是:消除了数据冗余、更新异常、插入异常和删除异常。
6. BC范式(BCNF)
BC范式在1NF基础上,要求任何非主属性不能对主键子集依赖(即在3NF基础上消除对主键子集的依赖)。若关系模式R是1NF,且每个属性(包括主属性)既不存在部分函数依赖也不存在传递函数依赖于R的候选码,这种关系模式就是BCNF模式。即在3NF基础上,数据库表中如果不存在任何字段对任意候选关键字段的传递函数依赖则符合BCNF。BCNF是修正的第三范式,又是也称扩充的第三范式,它是3NF的子集,因此满足BCNF必须满足3NF。
对于BCNF,在主键的任何一个真子集都不能决定于主属性。关系中U为主键,若U中的任何一个真子集X都不能决定于主属性Y,则该设计规范属于BCNF。例如:在关系R中,U为主键,A属性是主键中的一个属性,若存在A -> Y(Y为主属性),则该关系不属于BCNF。
7. 四种范式之间的关系:
BCNF ⊆ 3NF ⊆ 2NF ⊆ 1NF。

...
...