本文参考自最简单的数据库“范式”教程
查看原文: 原文地址
既然都叫最简单的数据库“范式”教程,我觉得它一定要满足这个要求:看完这篇博客,你一定会明白数据库的“范式”和那些诸如“完全函数依赖”,“部分函数依赖”,“传递函数依赖”等烦人的概念,前提是你得跟着我的思路认真的读完它,好,准备好你的半个小时了吗?我们开始。
目录
- 什么是范式?
- 贯穿全文的一个例子。
- 第一范式(1NF)
- 几个重要的概念。
- 第二范式(2NF)
- 第三范式(3NF)
- BC范式(BCNF)
- 第四范式(4NF)
1. 什么是范式?
范式其实就是关系数据库规范程度的级别
,举个我们生活中的例子,老师让打扫卫生,最低标准是扫地
,二级标准是扫地+擦桌子
,三级标准是扫地+擦桌子+擦玻璃
,实际上在标准不断上升的过程中,首先高一级的标准是满足低一级标准的,范式也是如此,只不过它的标准描述的是数据库规范化的程度罢了。数据库中的范式有1NF , 2NF , 3NF , BCNF , 4NF,5NF(本文不讨论)。它们之间的关系1NF < 2NF < 3NF < BCNF < 4NF
(默认越大 级别越高)。
2.贯穿全文的一个例子。
这个例子有下面的关系
(学号,课名)->分数
学号->姓名
学号->系名
系名->系主任
注:A->B:理解为A属性可以唯一确定B属性。
这个例子会在说第二范式和第三范式的时候被逐步优化。
3.第一范式(1NF)
数据库表的每一列都是不可再分的原子数据项,它是一个关系型数据库的最低标准,如果不满足第一范式,那么这个数据库就不是关系型数据库。如下所示:
这个表我们无法在数据库中直接创建,因为它的系
这一列,既有系名
又有系主任
,产生了冲突,如果作出调整,使它符合第一范式,那么应该是这样的:
但是即使这样,数据库中还是会存在诸如插入、删除、数据冗余等异常。比如针对下面的表:
- 数据冗余:可以看到姓名、系名和系主任这三列冗余非常大。
- 插入异常:如果目前开设了计算机系,但是尚未招生,那么计算机系是无法插入到表的系名中的,(学号,课名)是主属性,不能为空。
- 删除异常:如果经济系的学生全部毕业了,在删除所有学生的时候,