范式
- 前置知识
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- BC范式(BCNF)
- 第四范式(4NF)
- 范式化设计和反范式化设计的优缺点?
前置知识
-
超键(super key): 在关系中能唯一标识元组的属性集称为关系模式的超键
-
候选键(candidate key): 不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了!
-
主键(primary key): 用户选作元组标识的一个候选键程序主键
-
外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。
-
x->y :y函数依赖于x
常见的范式有1NF、2NF、3NF、BCNF、4NF。下面对这几种常见的范式进行简要分析。
第一范式(1NF)
每一列保持原子特性
列都是基本数据项,不能够再进行分割,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
看下面数据表,对于选课列明显是可以再分的,所以它是违反第一范式的。
第二范式(2NF)
属性完全依赖于主键-主要针对联合主键
第二范式必须先满足第一范式。另外包含两部分的内容:一是表必须有一个主键;二是表中非主键列必须完全依赖于主键,而不能只依赖于主键的一部分。
非主属性完全依赖于主关键字,如果不是完全依赖主键,应该拆分成新的实体,设计成一对多的实体关系。
例如:
假设当前有一个选课关系表为SelectCourse(学号, 课程名称, 成绩, 学分),其中(学号,课程名称)是联合主键,但是学分字段只和课程名称有关,和学号无关,相当于只依赖联合主键的其中一个字段,不符合第二范式。
这样可能会存在的问题:
- 数据冗余:,每条记录都含有相同信息;
- 删除异常:删除所有学生成绩,就把课程信息全删除了;
- 插入异常:学生未选课,无法记录进数据库;
- 更新异常:调整课程学分,所有行都调整。
我们可以将主表中学分字段去掉,同时将课程名称和和学分单独建立一张表作为子表,其中课程名称作为子表主键,这样两张表中所有非主键列都完全依赖主键。不仅符合第二范式,还符合第三范式。
第三范式(3NF)
定义:首先是满足 2NF,另外非主键列必须直接依赖于主键,表中的列不存在对非主键列的传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
再看这样一个学生信息表:
上表中,主键为:(学号),所有字段 (姓名,性别,班级,班主任)都依赖与主键(学号),不存在对主键的部分依赖。所以是满足第二范式。但是,表中存在一个传递依赖,(学号)->(班级)->(班主任)。也就是说,(班主任)这个非主键列依赖与另外一个非主键列 (班级)。所以不符号第三范式。
可能会存在的问题:
-
数据冗余:有重复值;
-
更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况 。
正确做法:把这个表拆分成如下2个表:
这样,对主键的传递依赖就消失了。上面的2个表都符合第3范式。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于:
- 2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;
- 3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
BC范式(BCNF)
在第三范式的基础上,不允许主键的一部分被另一部分或其它字段决定。即任何非主属性不能对主键子集依赖(即在3NF基础上,消除主属性对候选码的部分函数依赖和传递函数依赖)。
在这张表中,联合主键1(姓名+科目)----》老师 ; 联合主键2(姓名+老师)----》科目。
既满足全部依赖,又满足直接依赖。所以属于第三范式。
(科目是联合主键1的一部分)(老师是联合主键2的一部分)
但是这里的(老师----》科目),老师可以决定科目。
就是说科目被老师所决定(主键的一部分被其他字段决定)。
BC范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。满足BC范式的关系都必然满足第三范式。或者还可以换一种说法:若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码都是单属性,则该关系自然达到BC范式。
一般来说,一个数据库设计符合3NF或BCNF就可以了。
第四范式(4NF)
对于每一个X->Y,X都能找到一个候选码( 若关系中的某一属性组的值能唯一地表示一个元组,而其真子集不行,则称该属性组为候选码)。
- 设R是一个关系模型,D是R上的多值依赖集合。如果D中存在凡多值依赖X->Y时,X必是R的超键,那么称R是第四范式的模式。
例如,职工表(职工编号,职工孩子姓名,职工选修课程),在这个表中,同一个职工可能会有多个职工孩子姓名,同样,同一个职工也可能会有多个职工选修课程,即这里存在着多值事实,不符合第四范式。如果要符合第四范式,只需要将上表分为两个表,使它们只有一个多值事实,例如职工表一(职工编号,职工孩子姓名),职工表二(职工编号,职工选修课程),两个表都只有一个多值事实,所以符合第四范式。
范式化设计和反范式化设计的优缺点?
范式化设计的优点在于:
- 可以尽量的减少数据冗余,数据表更新快体积小
- 范式化的更新操作比反范式化更快
- 范式化的表通常比反范式化更小
缺点在于:
- 对于查询需要对多个表进行关联(导致性能降低)
- 更难进行索引优化
反范式化优点在于:
- 可以减少表的关联
- 可以更好的进行索引优化
缺点:
- 存在数据冗余及数据维护的异常
- 对数据的修改需要更多的成本