数据库设计范式

目录

第一章 数据库基础知识



前言

  认为自己大学时学得不够深入,发现实际工作中需要用到它的地方很多。因此记下此文帮助自己梳理知识,也希望可以给需要的你提供帮助。自学之路,如有错误,请纠正,万分感谢


来自笔者内心理解(以及结合相关文献 综合思考后)的正文:

数据库设计范式

定义及作用

  范式是关系型数据库设计规范,其引入是为了解决存储异常(增删改异常)数据冗余等问题,并不能提高访问效率。

种类

  按要求由低到高:1NF ⊃ 2NF ⊃ 3NF ⊃ BCNF ⊃ 4NF ⊃ 5NF。
  高级别范式都在低级别范式的基础上增加了要求,级别越高数据冗余越小,但查询也越复杂,一般只需满足第三范式。

第一范式(1NF)

  定义 关系中的每个属性都不可分,即每个字段都是不可再分的数据单元

  看完如下两个例子就明白啦~
  e.g.1_第一范式的错误方式:
错误划分方式
  我们发现,在“联系方式”里还包含有“手机号”和“邮箱”,违背了第一范式中的字段不可分性。应设置为如下形式:

  e.g.2_第一范式的正确方式:
正确划分方式

第二范式(2NF)

  定义 在第一范式的基础上,消除了非主属性对于码(键)的部分依赖,非主键字段完全依赖于候选码字段
  即必须有一个(及以上)的主键,没有包含在主键中的列必须全部依赖于全部主键,而不能只依赖于主键的一部分。

  何为部分依赖?同样的我们来看个例子~

  第一范式划分好后的表:【准考证号,考试科目】为我们的主属性
第一范式划分好后的表
  它的字段关系如下:
字段关系
    由上图可看出,准考证号可唯一确定【姓名,手机号,邮箱,专业名称,专业主任】,无需通过考试科目来确定
  则我们认为【姓名,手机号,邮箱,专业名称,专业主任】部分依赖于【准考证号,考试科目】

  这样做有何缺点
第一范式表

  1.存在大量数据冗余:每一名考生的准考证号、姓名等数据重复多次。每个专业与对应主任的数据也重复多次。
  2.存在插入异常:假如新建一个专业,但没有招收任何学生,无法将专业名称与专业主任的数据插入到数据表中。
  (因为主键值不可为空,即准考证号与考试科目不可为空)
  3.存在修改异常:假如高纯转入网络安全专业,需要同时修改三条记录中专业名称与专业主任的数据。
  4.存在删除异常:假如将某专业中所有考生的记录都删除,那么此专业的专业名称与专业主任的数据也就随之消失。
  (一个专业所有考生不存在,并不能表示这个专业不存在)

  如何消除部分依赖,使其满足第二范式

  模式分解后字段关系如下:
第二范式关系图
  表结构如下:
第二范式表结构
  改进之前的缺点了吗
  1.存在大量数据冗余?【有改善】 每一名考生的准考证号、姓名;每个专业与对应主任的数据重复次数减少。
  2.存在插入异常?【无改善】 若新建一个专业,但没有设置考生,无法将专业名称与专业主任的数据插入到表中。
  3.存在修改异常?【有改善】 若高纯转入网络安全专业,只需修改一条记录中专业名称与专业主任的数据。
  4.存在删除异常?【无改善】 若将某专业中所有考生记录都删除,那么此专业名称与专业主任的数据也随之消失。

  因此,仅符合2NF的要求,很多情况下还不够,我们还需将符合2NF要求的数据库表改进为符合3NF要求的数据库表。

第三范式(3NF)

  定义 在第二范式的基础上,消除传递依赖,非主键列必须直接依赖于主键列

  何为传递依赖
  上例中,专业名称可唯一确定专业主任,无需通过准考证号来确定,则【专业主任】传递依赖于【准考证号】。

  如何消除传递依赖,使其满足第三范式

  模式分解后字段关系如下:
第三范式字段关系
  表结构如下:
第三范式表结构
  改进之前的缺点了吗
  1.存在大量数据冗余?【有改善】 无需写出每一个考生的专业主任。
  2.存在插入异常?【有改善】 假如新建一个专业但没有设置考生,也可将专业名称与专业主任的数据插入到表中。
  3.存在删除异常?【有改善】假如将某专业中所有考生记录都删除,那么此专业名称与专业主任的数据依然存在。

总结

  1NF:关系中的每个属性都不可分。
  2NF:在1NF基础之上,消除了非主属性对于码(键)的部分函数依赖。
  3NF:在2NF基础之上,消除了非主属性对于码(键)的传递函数依赖。


愿你拥有这世间无尽的温柔,sincerely,end.