在了解数据库范式之前先了解数据库的范式
范式:
数据库的范式是一组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式。
关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式),越高的范式数据库冗余越小。然而,普遍认为范式越高虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙,因此在实际应用中,数据库设计通常只需满足第三范式即可。
一.第一范式
定义:数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,对象等非原子数据。
在关系型数据库的设计中,满足第一范式是对关系模式的基本要求。不满足第一范式的数据库就不能被称为关系数据库
拿学生表来举例不符合第一范式要求的例子
可以看到学校列还能再分不符合第一范式每一列不可分割的要求
正确的列↓

快捷的辨别方式
在关系型数据库中,每一列都可以用基本数据类型表示,就天然满足第一范式
二.第二范式
定义:在满足第一范式的基础上,不存在非关键字段对任意候选键的部分函数依赖。存在于表中定义了复合主键的情况下。
候选键:可以唯一标识一行数据的列或列的组合,可以从候选键中选一个或多个当做表的主键(例如主键,唯一键,普通主键,外键等等)
举个例子看下面一张表

这张表中使用学号+课程名定义复合主键来唯一标识一个学生某门课程的成绩
学生是通过学号来确定的,学生的姓名、年龄和性别和课程没有关系,即学生的信息只依赖学号,不依赖课程名;学分是通过课程来确定的,课程的学分与学生没有关系,即学分只依赖课程名,不依赖学生
对于使用复合主键的表,如果一行数据中的有些列只与复合主键中的一个或其中几个列有关系,那么就说他存在部分函数依赖,也就不满足第二范式
对于没有复合主键的表也就天然满足第二范式
上述表可以改正为三个表:
学生表:

课程表:

成绩表:

不满足第二范式时可能出现的问题:
1. 数据冗余
学生的姓名、年龄、性别和课程的学分在每行记录中重复出现,造成了大量的数据冗余。
2. 更新异常
如果要调整MySQL的学分,那么就需要更新表中所有关于MySQL的记录,一旦执行中断导致某些记录更新成功,某些数据更新失败,就会造成表中同一门课程出现不同学分的情况,出现数据不一致问题。
3. 插入异常
目前这样的设计,成绩与每一门课和学生都有对应关系,也就是说只有学生参加选修课程考试取得了成绩才能生成一条记录。当有一门新课还没有学生参加考试取得成绩之前,那么这门新课在数据库中是不存在的,因为成绩为空时记录没有意义。
4. 删除异常
把毕业学生的考试数据全都删除,此时课程和学分的信息也会被删除掉,有可能导致一段时间内,数据库里没有某门课程和学分的信息。
三.第三范式
定义:在满足第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖。

因为是要描述学生信息,并且在表中定义了Id为主键,Id可以明确的标识每条学生信息
在这个表结构中,可以看出学生的学号、姓名、年龄、性别、学院与主键Id强相关;学院电话与学院强相关;在一个表中出现了两个强相关的关系,而且这两个强相关关系又存在传递现象,即通过学生Id可以找到学生记录,学生记录中包含学院名,每个学院又有自己的电话
这种传递现象称为传递依赖,所以当前的表不满足第三范式
改正
学生表

学院表

表的设计的关系模型:
⼀对⼀关系
⼀个⽤户实体包含的属性有:⽤户昵称,真实姓名,⼿机号,邮箱地址,性别,学校
⼀个账户实体包含的属性有:登录⽤户名,密码
⽤户实体与账户实体是⼀对⼀的关系↓
⼀对多关系
⼀个学⽣实体包含的属性有:真实姓名,学号,年龄,性别,⼊学时间
⼀个班级实体包含的属性有:班级名,学⽣⼈数
⼀个班级中有多个学⽣所以班级实体与学⽣实体是⼀对多的关系,反过来说学⽣实体与班级实体是多对一
多对多关系
⼀个学⽣实体包含的属性有:真实姓名,学号,年龄,性别,⼊学时间
⼀个课程实体包含的属性有:课程名
⼀个学⽣可以选修改多⻔课程,⼀⻔课程也可以被多名学⽣选修改,所以学⽣与课程之间是多对多关系
对于多对多关系,可以使⽤中间表进⾏记录,⽐如⼀个学⽣参加了某⼀⻔课程的考试得到了相应的成绩








