Python服务器运维笔记:第一章数据库精讲 - 1.1.8 三大范式
前言:本文是学习网易微专业的《python全栈工程师》 中的《服务器运维开发工程师》专题的课程笔记,欢迎学习交流。同时感谢老师们的精彩传授!
一、课程目标
- 范式一
- 范式二
- 范式三
二、详情解读
设计范式指数据库设计时要遵循的原则。三大范式分别从数据表的列,数据表的行以及数据表之间的关系进行规范。
2.1.范式一
2.1.1.第一范式
在关系模型中,对数据列的一个规范要求,所有的列都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF
)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的列。
比如下图中,contact
的设计不符合第一范式,把它改为mobile
字段,只存储手机号码,则是符合第一范式的数据库表设计。
2.2.范式二
2.2.1.第二范式
满足第二范式(2NF
)必须先满足第一范式(1NF
)。第二范式(2NF
)要求数据库表中的每个实例或记录必须可以被唯一的区分,即每一行代表一个不同的实体。
比如下图中,一行存在多个用户,是不符合第二范式的。将name2
和age2
字段去掉,里面的值当作第2条记录存储入库,则符合第二范式。
2.3.范式三
2.3.1.第三范式
第三范式(3NF
)是第二范式(2NF
)的一个子集,即满足第三范式(3NF
)必须满足第二范式(2NF
)。简而言之,第三范式(3NF
)要求一个关系中不包含已在其它关系已包含的非主关键字信息。
比如下图,表中的school
和school_address
字段容易造成数据冗余
可以将这两个字段单独作为一个表2,然后在表1中添加一个外键school_id
,这样就符合第三范式。
好友示例:
一行里既有会员自身的信息,又有好友的信息,这样是不符合数据库表设计第三范式的。
可以修改为下图的表:
三、课程小结
- 01 第一范式,针对数据表的列。设计数据表时,每一个字段都是用户实体的最小的属性,最小取决于业务的需要。
- 02 第二范式,针对数据表的行。数据表一行里只能是一个实体,而不能代表多个实体。
- 03 第三范式,如果一行里的数据包含其它实体的信息,可以将它拆分为两张表,然后将两张表关联起来。