一、引入三大范式


  • 必须保证数据库设计的合理性
       -数据库设计关系整个系统的架构,关系到后续的开发效率和运行效率
       -数据库的设计主要包含了设计表结构和表之间的联系
  • 如何是合理数据库
       -结构合理
       -冗余较小
       -尽量避免插入删除修改异常

更新异常(Update Anomalies)
数据冗余 ,更新数据时,维护数据完整性代价大
例:某系更换系主任后,系统必须修改与该系学生有关的每一个元组
插入异常(Insertion Anomalies)
该插的数据插不进去
如果一个系刚成立,尚无学生,就无法把这个系及其系主任的信息存入数据库
删除异常(Deletion Anomalies)
不该删除的数据不得不删
如果某个系的学生全部毕业了,在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了

  • 如何才能保证数据库设计水平
       -遵循一定的规则
       -在关系型数据库中这种规则就称为范式
  • 什么是范式(NF= NormalForm)
       -范式是符合某一种设计要求的总结。
       -要想设计一个结构合理的关系型数据库,必须满足一定的范式。
    MySql三大范式_mysql
    第一范式
    确保每列保持原子性(不可再分割)
    MySql三大范式_主键_02
    在上面的表中,“家庭信息”和“学校信息”列均不满足原子性的要求,故不满足第一范式,调整如下:MySql三大范式_数据_03
    第二范式
  • 在1NF的基础上,第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
  • 即在一个数据库表中只描述一件事情。

示例


  • 学号和课程编号作为联合主键
  • 课程名称只依赖于课程编号,而和学号没有关系
    MySql三大范式_数据_04
    解决:
    MySql三大范式_mysql_05MySql三大范式_mysql_06
    第三范式
  • 在2NF基础上,确保数据表中的每一列数据都和主键直接相关,而不能间接相关
  • 属性不依赖于其他非主属性。

示例

MySql三大范式_数据库_07MySql三大范式_主键_08

二、反范式

往往我们在实际项目中,考虑性能和效率问题,会违反三大范式的约束。

规范性和性能问题

 关联查询的表不能超过三张

   - 考虑商业的需求和目标,(成本、用户体验!)数据库的性能更加重要

   - 在规范性能的问题时,需要适当考虑一下规范性