Python服务器运维笔记:第一章数据库精讲 - 1.1.8 三大范式

前言:本文是学习网易微专业的《python全栈工程师》 中的《服务器运维开发工程师》专题的课程笔记,欢迎学习交流。同时感谢老师们的精彩传授!

一、课程目标

  • 范式一
  • 范式二
  • 范式三

二、详情解读

设计范式指数据库设计时要遵循的原则。三大范式分别从数据表的列,数据表的行以及数据表之间的关系进行规范。

2.1.范式一
2.1.1.第一范式

在关系模型中,对数据列的一个规范要求,所有的列都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的列。

比如下图中,contact的设计不符合第一范式,把它改为mobile字段,只存储手机号码,则是符合第一范式的数据库表设计。
在这里插入图片描述

2.2.范式二
2.2.1.第二范式

满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一的区分,即每一行代表一个不同的实体。

比如下图中,一行存在多个用户,是不符合第二范式的。将name2age2字段去掉,里面的值当作第2条记录存储入库,则符合第二范式。
在这里插入图片描述

2.3.范式三
2.3.1.第三范式

第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。

比如下图,表中的schoolschool_address字段容易造成数据冗余
在这里插入图片描述
可以将这两个字段单独作为一个表2,然后在表1中添加一个外键school_id,这样就符合第三范式。
在这里插入图片描述

好友示例:
一行里既有会员自身的信息,又有好友的信息,这样是不符合数据库表设计第三范式的。
在这里插入图片描述
可以修改为下图的表:
在这里插入图片描述

三、课程小结

  • 01 第一范式,针对数据表的列。设计数据表时,每一个字段都是用户实体的最小的属性,最小取决于业务的需要。
  • 02 第二范式,针对数据表的行。数据表一行里只能是一个实体,而不能代表多个实体。
  • 03 第三范式,如果一行里的数据包含其它实体的信息,可以将它拆分为两张表,然后将两张表关联起来。