数据库三大范式

134 阅读4分钟

第一范式

现在有这样一张表,表头为:员工编号、姓名、部门、季度、考核结果,其中部门并不是单一列,由部门名称和部门领导组成。

| 员工编号 | 员工姓名 | 部         门   | 季度  | 考核结果  |
|---------|----------|部门名称|部门领导|-----------|-------|

此时这张表不满足第一范式。

第一范式:每一个列必须是单一列,而不能是复合列。

用第一范式来设计这张表:

| 员工编号 | 员工姓名 | 部门名称 | 部门领导 | 季度  | 考核结果  |
|---------|--------|---------|---------|------|---------|
| 001     | 张三   | 开发部  | 王经理  | Q1   | 优秀    |
| 001     | 张三   | 开发部  | 王经理  | Q2   | 良好    |
| 001     | 张三   | 开发部  | 王经理  | Q3   | 一般    |
| 001     | 张三   | 开发部  | 王经理  | Q4   | 优秀    |
| 002     | 李四   | 销售部  | 赵经理  | Q1   | 良好    |
| 002     | 李四   | 销售部  | 赵经理  | Q2   | 优秀    |
| 002     | 李四   | 销售部  | 赵经理  | Q3   | 优秀    |
| 002     | 李四   | 销售部  | 赵经理  | Q4   | 良好    |
| 003     | 王五   | 人事部  | 刘经理  | Q1   | 一般    |
| 003     | 王五   | 人事部  | 刘经理  | Q2   | 良好    |
| 003     | 王五   | 人事部  | 刘经理  | Q3   | 一般    |
| 003     | 王五   | 人事部  | 刘经理  | Q4   | 优秀    |

第一范式存在什么问题呢?插入异常、删除异常、修改异常。

  1. 插入异常。假如现在要插入一个员工,编号=004,姓名=麻六,部门名称=开发部,部门领导=王经理,但是这个员工还没有考核信息,而插入记录必须要有值,这时考核信息为空,就无法插入员工基本信息了。
  2. 删除异常。假如误添加某个员工Q4的考核,现在要删除,那么整条记录就要被删除,使得基本信息也要被删除,从而造成删除异常,即不应该删除的信息也被删除了。
  3. 修改异常。如果人事部的领导换了,那么就需要修改多条记录。

第二范式的作用就可以修改这些问题。

第二范式

先看定义:

第二范式:在第一范式的基础上,非主键列完全依赖于主键列,而不能是依赖于主键的一部分。

如果用第二范式来检查上面的表设计,会发现这张表明显不符合特征:姓名、部门名称、部门领导、职位名称都是依赖于编号,而季度和考核结果不依赖于编号,所以这个表设计是不合理的,解决方法就是将符合第二范式的列合并进一个表中,将不符合的列重新建表。

员工基本信息表

员工编号 | 员工姓名 | 部门名称 | 部门领导 |
| ---- | ---- | ---- | ---- |
| 001  | 张三   | 开发部  | 王经理  |
| 002  | 李四   | 销售部  | 赵经理  |
| 003  | 王五   | 人事部  | 刘经理  |

季度考核表

员工编号 | 季度 | 考核结果 |
| ---- | -- | ---- |
| 001  | Q1 | 优秀   |
| 001  | Q2 | 良好   |
| 001  | Q3 | 一般   |
| 001  | Q4 | 优秀   |
| 002  | Q1 | 良好   |
| 002  | Q2 | 优秀   |
| 002  | Q3 | 优秀   |
| 002  | Q4 | 良好   |
| 003  | Q1 | 一般   |
| 003  | Q2 | 良好   |
| 003  | Q3 | 一般   |
| 003  | Q4 | 优秀   |

可以看到季度考核表现在没什么问题,但是员工基本信息表出现问题了,部门名称和部门领导都要依靠编号才能出现,如果员工被删除,部门名称和部门领导就没了,这样设计还是有缺陷,这时候就需要第三范式了。

第三范式

同样先看定义:

第三范式:在第二范式的基础上,非主键列完全依赖于主键列,不依赖于其他非主键。

拆分结果如下:

员工表

| 员工编号 | 员工姓名 | 部门编号 |
| ---- | ---- | ---- |
| 001  | 张三   | 1    |
| 002  | 李四   | 2    |
| 003  | 王五   | 3    |

部门表

| 部门编号 | 部门名称 | 部门领导 |
| ---- | ---- | ---- |
| 1    | 开发部  | 王经理  |
| 2    | 销售部  | 赵经理  |
| 3    | 人事部  | 刘经理  |

季度考核表

| 员工编号 | 季度 | 考核结果 |
| ---- | -- | ---- |
| 001  | Q1 | 优秀   |
| 001  | Q2 | 良好   |
| 001  | Q3 | 一般   |
| 001  | Q4 | 优秀   |
| 002  | Q1 | 良好   |
| 002  | Q2 | 优秀   |
| 002  | Q3 | 优秀   |
| 002  | Q4 | 良好   |
| 003  | Q1 | 一般   |
| 003  | Q2 | 良好   |
| 003  | Q3 | 一般   |
| 003  | Q4 | 优秀