三大范式

Posted Lachlan_Yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三大范式相关的知识,希望对你有一定的参考价值。

1. 三大范式

可以帮助我们设计一个高效的数据库

1.1 第一范式1NF

定义:所有列不可以再分。
简单的说,就是要保证某张表中的某个字段,是原子的。
例如我们经常看到的表结构会有,姓名、性别、手机号、邮箱等等字段,那么为什么不直接叫做 联系人信息字段呢?然后存一个字符串或者 Json 串。其实主要也是遵循了第一范式。
假定字段userInfo广东省10086 ,依照第一范式拆解成userInfo广东省和userTel 10086两个字段

1.2 第二范式2NF

满足第一范式的条件下包含两个部分

  • 表必须有一个主键
  • 非主键列必须完全依赖于主键,而不是只依赖于主键的一部分
假定选课关系表为student_course 
表中有留个字段,分别是student_no,student_name,age,course——name,grade,credit
主键为(student_no,course_name)
其中学分完全依赖于课程名称,姓名年龄完全依赖于学号,不符合第二范式
会导致数据冗余(学生选择N门课,姓名年龄有N条记录),插入异常(插入一门新课,因为没有学号,无法保存新课记录)等问题
因此需要拆分成三个表:
学生:student表(student_no,student_name,年龄)
课程:course表(course_name,credit)
选课关系:student_course_relation表(student_no,course_name,grade)

1.3 第三范式3NF

满足第二范式的条件下,非主键列必须直接依赖于主键,不能存在传递依赖

即不能存在:非主键列A依赖于非主键列B,非主键列B依赖于主键

假定学生关系表student
表有五个字段分别为student_no,student_name,age.academy_id,academy_telephone
主键为学号student_no其中学院id依赖于学号,而学院地点和学院电话依赖于学院id们存在传递依赖,不符合第三范式
因此分为两个表
- 学生(student_no,student_name,age,academy_id)
- 学院(academy_id,academy_telephone)

1.3.1 第二范式和第三范式的区别

  • 2NF依据是非主键列是否完全依赖于主键,还是依赖于主键的一部分
  • 3NF依据是非主键列是否直接依赖于主键,还是直接依赖于非主键

以上是关于三大范式的主要内容,如果未能解决你的问题,请参考以下文章

三大范式(小白视角,一看就懂)

三大范式

数据库设计三大范式

数据库设计三大范式

数据库三大范式

MySQL 基础知识 三大范式