数据库基础:关系型数据库设计三大范式你能说的清楚吗?
对于初学者,数据库的三大范式那是一定要搞清楚,弄明白的,简单的说就是要建立结构合理,逻辑清晰的数据库。
第一范式:属性是最小单元,确保表中每列的原子性,不可分割;
举例说明:
学号 | 姓名 | 班级 |
10001 | 张三 | 五年二班 |
10002 | 李四 | 三年五班 |
上面的例子不符合第一范式,原因是班级不是最小单元,还可以拆分成年级、班级,修改后
学号 | 姓名 | 年级 | 班级 |
10001 | 张三 | 五年 | 二班 |
10002 | 李四 | 三年 | 五班 |
第二范式:满足第一范式的基础上,一张表中某一属性必须依赖所有主键才能获得,不能存在依赖某一个主键查出;
举例说明:假如学号和课程是主键
学号 | 姓名 | 系名 | 课程 | 分数 |
10001 | 张三 | 计算机系 | 计算机基础 | 89 |
10001 | 张三 | 计算机系 | Java开发 | 69 |
10002 | 李四 | 计算机系 | 计算机基础 | 87 |
10002 | 李四 | 计算机系 | Java开发 | 92 |
上面的例子符合第一范式,但是不符合第二范式,因为一个表中的某一属性必须完全依赖主键才能获得,例子中要想获得准确的分数,必须通过学号和课程才能获得,但是名字只需要通过学号就能获得,所以不是完全依赖于主键。修改后:拆分成两张表
学号 | 课程 | 分数 |
10001 | 计算机基础 | 89 |
10001 | Java开发 | 69 |
10002 | 计算机基础 | 87 |
10002 | Java开发 | 92 |
学号 | 姓名 | 系名 |
10001 | 张三 | 计算机系 |
10002 | 李四 | 计算机系 |
第三范式:首先满足第二范式,一张表的某一属性,必须直接依赖主键,不能出现这个属性依赖另一个非主键的属性,然后非主键属性依赖主键;
举例说明:假如学号是主键
学号 | 姓名 | 系名 | 系主任 |
10001 | 张三 | 计算机系 | 小明 |
10002 | 李四 | 计算机系 | 小明 |
10003 | 王五 | 电子工程系 | 小冬 |
上表中可以通过学号、系名找到系主任,但是系主任管理多个学生,不可能反推回去,也没有必要,造成数据的冗余。修改后
学号 | 姓名 | 系名 |
10001 | 张三 | 计算机系 |
10002 | 李四 | 计算机系 |
10003 | 王五 | 电子工程系 |
系名 | 系主任 |
计算机系 | 小明 |
计算机系 | 小明 |
电子工程系 | 小冬 |
以上就是我对关系型数据三大范式的理解,总结如下:第一范式的作用是要求每个关系的属性为原子性的,不可再分。即表中不能还有表。满足第二范式必须满足第一范式。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
如有不同见解,欢迎在评论区留言,共同成长,一同进步。