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依据是非主键列是否直接依赖于主键,还是直接依赖于非主键