范式概念
符合某一种级别的关系模式的集合,即设计数据库必须遵循一定的规则,在关系型数据库中,这种规则就是范式。
提出范式是为数据库建模提供一个理论基础,它也有缺陷,于是又提出了反范式,是对范式不足之处的一些补充,而不是全盘否定。
六种范式
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。
范式化较高的数据库通常的缺点就是连接操作(关联操作),它可能会使内存开销瞬间提高几个档次。
对于经常会进行写操作的应用,通常建议对数据库建模实现较高的范式化。