范式是关系数据库设计的重要规则,下面我来介绍下1NF、2NF、3NF
首先来了解一下范式需要的的前置知识
函数依赖
我觉得类似数学中的函数,描述的是一个映射关系。在一个关系R中,一个集合X在另一个集合Y中总能唯一对应(X→Y)。则X决定Y或者Y依赖于X。
简单点说就是:一个属性集决定另一个属性集。
其中函数依赖还可以根据不同性质分为完全函数依赖、部分函数依赖、传递函数依赖。在这里我们可以借助集合的概念帮助理解。
1.完全函数依赖:存在X → Y,X中的任何真子集X‘ ,存在X‘ !→ Y
例:(学号,课程号)→ 成绩
学号 !→ 成绩,课程号 !→ 成绩
所以(学号,课程号)→ 成绩 是完全函数依赖。
2.部分函数依赖:存在X → Y,X中的任何真子集X‘ ,存在X‘ → Y
例:(学号,姓名)→ 性别
学号 → 性别
所以(学号,姓名)→ 性别 是部分函数依赖
3.传递函数依赖:存在X → Y → Z、Y !→ X。则X → Z
例:学号 → 系名→ 系主任
系名 !→ 学号
所以学号 → 系主任 是传递函数依赖。
主属性与非主属性
主属性:包含在任何一个候选键中的属性称主属性。
非主属性:不包含在任何一个候选键中的属性称为非主属性。
关于键请参考:https://blog.youkuaiyun.com/xyzyhs/article/details/99438912
下面来介绍范式:
1NF
第一范式的核心为原子性,所有的内容都应该是符合原子性的,也就是不可分割。
表1
表1中这种情况,手机号属性中填写了两个内容,这是不符合1NF。
2NF
第二范式主要有2点:1.满足1NF。2.所有非主属性都完全依赖于候选关键字。
(在1NF基础上消除非主属性对主码的部分函数依赖)
非主属性和完全依赖的概念,在前面已经详细介绍过,这里不再赘述,直接举例
选课关系表:R(学号,姓名,年龄,课程号,成绩,学分),候选关键字(学号,课程名称)
(学号,课程名称) → (姓名,年龄,成绩,学分)
且(学号)→(姓名,年龄),(课程号)→(成绩,学分) 所以不满足第二范式。
要想满足第二范式应修改为:R1(学号,姓名,年龄)
R2(课程号,成绩,学分)
3NF
第三范式主要有2点:1.满足2NF。2.所有非主属性都不存在传递依赖。
(在2NF基础上消除传递依赖)
例:学生关系表:R(学号,姓名,年龄,所在学院,学院地点,学院电话)
存在(学号) → (所在学院) → (学院地点,学院电话) 所以不满足第三范式
要想满足第三范式应修改为:R1(学号,姓名,年龄,所在学院)
R2学院:(学院,地点,电话)
最后总结一下:1NF:字段取值不可再分(原子性)
2NF:在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
3NF:在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)