数据库设计三范式与反范式

MySql设计与优化系列笔记:
一、数据库设计三范式与反范式
二、MySql表设计与优化

第一范式:

1、数据库的所有字段都是单一属性,不能再被拆分
2、单一属性由基本的数据类型构成
3、数据库的表都是二维的(行和列)

错误示例:字段包含姓名、年龄、身高、出生年月日等多个属性,可以继续拆分

第一范式错误样表

正确示例
第二范式的问题:字段出现大量重复数据;存在新增异常、更新异常、删除异常;
当新增课程信息,但没有学生信息时,会出现部分字段空白,称为插入异常。
当高芳芳同学转学离开后,法律系课程信息也会被删除,这称之为删除异常
当李小明同学转系到法律系,除了系名要更改,系主任等字段也要同时跟着更改,这成为更新异常

第一范式正确样表

第二范式

目的:通过拆表解决第一范式中数据冗余的问题。单并没有解决增删改异常的问题
1、要符合第一范式
2、必须要有一个主键(一列或多列)
3、其它字段可由主键确定

第二范式样表,像学生信息和课程信息进行拆分,由主键进行关联
当删除高芳芳时,法律系也会被删除,产生删除异常。如果需要避免,则需要引入第三范式

第二范式样表

第三范式

1、要求符合第二范式
2、字段要直接依赖于主键,不允许简介依赖(第二范式样表中:系主任与学号无关,与系名挂钩)
3、

第三范式,分析数据关系拆分实体,产生主表与从表,解决了存在的增删改异常的问题,但是产生了大量的主从表

第三范式样表

反范式设计

  • 收货地址:省市县小区,范式设计需要将收货地址设置为4张表,造成sql压力
范式设计
取出完整地址信息
反范式设计

只需要 select * from .. 即可

  • 反范式设计优缺点

通过字段冗余,变成单表查询,降低sql复杂度
因存在字段冗余,当更新操作时,需要进行额外的从表更新操作,需要多次更新操作
不合理的凡范式设计会让表变得臃肿

  • 整理自老齐的it加油站以及其它互联网资料

你可能感兴趣的:(数据库设计三范式与反范式)