范式就是一张数据表结构所符合的某种设计标准的级别;这跟我们后面要学习的事务的隔离级别有点像,就是级别不同,标准就不同,后一个级别会解除前一个级别存在的部分问题.
要了解范式,我们先把以下几个概念搞清楚:
1,超键(super key): 在关系中能唯一标识元组的属性集
2,候选键(candidate key): 不含有多余属性的超键
3,主键(primary key):从一个关系的多个候选键中,选定一个作为主键
4,主属性: 任何一个候选键中的属性
比如我们有一个学生表如下:
针对这张表,超键/候选键/主键分别如下:
超键: 学号, 身份证号码, (学号,姓名), (学号,性别), (身份证号码,姓名),(身份证号码,性别)…..这些单个的属性或者组合属性,均能唯一标识元组的属性值;
候选键: 学号, 身份证号码;比如(学号,性别)这个超键,如果去掉了性别,学号也能唯一标识元组的属性,所以(学号,性别)就不属于候选键.
主键: 学号;(在学号或者身份证号码里面任意挑选一个,均可以作为主键)
非主属性:不包含在任何一个候选码(键)中的属性称为非主属性
说完了超键/候选键/主键,咱们来说一下函数依赖.
函数依赖(一个或者一组属性的值可以决定其他属性的值,),依然拿学生表为例来说明什么是部分依赖以及传递依赖:
1,部分依赖
在学生表中,(学生编号,课程编号)作为主键,可以唯一标识每一条元组;
2,传递依赖
好了,知道了什么是部分依赖什么是传递依赖,我们再来解释什么是第一、二、三范式:
1,第一范式
定义: 关系中每一个数据不可再分(不能以集合/序列等作为属性),也就是关系中没有重复的列(比如电话号码这个属性既存在一个手机号又存在一个家庭号码,这种情况就不属于第一范式,除非把手机号作为一个列,家庭号码也作为单独一列。);
但是第一范式存在以下问题:
1) 数据冗余(比如学生编号、学生姓名、班级编号、院系等属性重复)
2) 插入数据异常 (比如新增一个名称为体育的院系,假如这个系没有学生,就不能插入)
3) 删除数据异常 (删除全部学生的信息, 院系也会被删除)
4) 修改数据异常 (假如存在学生转系的情况,修改会很繁琐)
2,第二范式
定义: 在1NF基础之上,消除非主属性对键的部分依赖,则称它为符合2NF;(把学生编号,课程标号,成绩单独拿出来作为一个表)
第二范式针对第一范式改进的地方:
1) 数据冗余减少了
2) 如果转系的话,只需要修改一次就可以
没有改进的地方:
1) 插入数据异常 (新增一个名称为体育的院系,假如这个系没有学生,依然增加不了)
2) 删除数据异常 (删除全部学生的信息, 院系也会被删除)
3,第三范式:
定义: 在2NF基础之上,消除非主属性对键的传递依赖,称为符合3NF;(要确定这个学生的院系,首先要经过学号来确定班级,通过班级来确定院系,所以院系对学号存在传递依赖;把院系拿出来单独作为一个表就可以了)
第三范式改进的地方:
1) 数据冗余降低了
2) 删除某个系全部学生,这个系不会受影响,依然存在
3) 可以插入一个没有学生的院系
以上就是关于第一范式、第二范式和第三范式的详细解释。
下一篇