MySQL 数据库三范式

72 阅读2分钟

第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的

第二范式:要求实体的属性完全依赖于主关键字,所谓完全依赖是指不能存在仅依赖主关键字一部分的属性

第三范式:任何非主属性不依赖于其他非主属性

第一范式举例:

原子性

image.png

将住址细分为多个属性,更后续方便操作

image.png

第二范式举例:

表示一张表只描述一件事:

image.png

图中,描述了学生信息,课程信息,学分依赖于课程名称,姓名年龄依赖于学号,这样做的后果是:

  1. 数据冗余,同一门课多个学生选修,学分会重复多次;同一个学生选择多门课程,姓名年龄重复多次
  2. 更新异常,若调整某门课程的学分,要更新很多行
  3. 插入异常,假设要开一门新课程,暂时没人选修,那么由于没有学号关键字,课程和学分也无法记录数据库
  4. 删除异常,假设所有学生完成了一门课程的选修,需要将这些选修记录删除,于此同时课程于学分也被删除,最终又回到了插入异常

修改后的结果:

image.png

第三范式举例:

保证每列都和主键直接相关

image.png

图中姓名,年龄,学院和主键直接关联,但学院地点电话却不直接和学号关联,同样会造成和第二范式一样的问题

修改后的结果:

image.png

2NF消除的是部分依赖,针对的是主键包含多个字段的情况,要求非主键列(非关键字段)必须依赖整个主键(关键字段),而不能依赖其中的一个字段或几个字段;3NF消除的是传递依赖,消除的是A->B->C这种,就是虽然C和A有关系,但是是通过B建立起来的关系

定理是死的,人是活的,在前人给我们总结出这些范式的前提下,使用这些范式灵活地应用到实际需求中,才是最重要的