🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[范式与反范式](http://www.kancloud.cn/aakng/mysql/211272) 范式概念 符合某一种级别的关系模式的集合,即设计数据库必须遵循一定的规则,在关系型数据库中,这种规则就是范式。 提出范式是为数据库建模提供一个理论基础,它也有缺陷,于是又提出了反范式,是对范式不足之处的一些补充,而不是全盘否定。 六种范式 1NF 2NF 3NF BCNF 4NF 5NF 一般数据库建模只要遵守到3NF或者BCNF即可,5NF通常被称为完美范式。  1、1NF 数据表的每一列都是不可再分割的基本数据项,即对属性的原子性约束。 2、2NF 数据表中每行都必须可以被唯一地区分,是为防止数据重复,通常是使用一个主键来唯一标识一条记录。 满足第二范式就肯定满足第一范式。 完全依赖、部分依赖:不能存在一条记录可以仅依赖于主键的一部分属性,比如主键是身份证号和姓名两个字段组成,整条记录可以只依赖主键,因为身份证号可以唯一确定一条记录,这就不是完全依赖,而是部分依赖。 直接依赖、传递依赖(函数依赖、间接依赖):a依赖b,b依赖c,则a肯定依赖c,这就是传递依赖,比如:学生信息表(学号,姓名,班级,班主任姓名),班主任姓名依赖于班级,班级依赖于学号,所以班主任姓名传递依赖学号,直接依赖班级(因为通常认为班主任是和一个班级联系起来的)。 3、3NF 非主属性之间不能相互依赖,必须直接依赖候选关键字。 候选关键字:具有唯一标识特性的一个或多个属性,比如班号,学号。 主属性:包含在任一候选关键字中的属性。 主关键字:即主键,分为单字段主键,多字段主键。 超关键字:单字段主键。 外关键字:外键。 4、BCNF 非主属性必须直接依赖主关键字。 通常我们把建模标准锁定为3NF或BCNF就可以了,越往后,表中存的冗余信息就越少,这也是范式理论的目的所在,但是一味地追求存储更少的冗余信息不是我们的最终目的,在硬盘廉价的现在,如何能更高效地查询数据也是很重要的。 ... 反范式概念 逆规范化,存在的意义就是弥补规范化,或者说是弥补范式的不足。 常用发规范技术 1、增加冗余列 就是在多个表中增加相同的列,是为了避免在查询时连接操作。 2、增加派生列 增加的列是来自其他表的数据,是由其他表数据经过计算生成,是为了在查询中减少连接操作。 3、重新组表和分割表 重新组表就是将两个表组合成一个表,从而减少连接来提高性能。 分割表通常是对表进行拆分,分为水平拆分和垂直拆分。 范式化的好处 1、范式化的更新操作比非范式化快。 2、范式化的表通常会很小,可以更好地加载到内存中,所以操作会更快。 3、由于很少有冗余,基本不需要使用distinct和group by。 范式化较高的数据库通常的缺点就是连接操作(关联操作),它可能会使内存开销瞬间提高几个档次。 对于经常会进行写操作的应用,通常建议对数据库建模实现较高的范式化。