范式:
符合某一级别的关系模式的集合,范式主要分为六大范式。
下面对其中常用的前三大范式做介绍
-
第一范式: 在此规则内,列具有原子性,不可再进行分割,同一列中不能有多个值。第一范式就是无重复的列。
例: 员工姓名、员工性别、电话
此例不符合第一范式,因电话可再分为手机电话、家庭电话、办公室电话等。 -
第二范式: 在第一范式的规则上,建立第二范式,在此规则中,要求每一行都都必须有唯一的标识,既需要有其中一列是不可重复的,通常是主键,作为唯一标识。第二范式就是非主键的列完全依赖于主键。
例: 员工编号、员工姓名、员工性别、手机电话
增加一列员工编号做为主键,作为唯一标识。 -
第三范式: 在第一、第二范式的规则上,要求表中非主键的列不依赖于其他非主键的列。
例: 员工编号、员工姓名、员工性别、手机电话、所在公司、公司地点、公司电话
公司地点和公司电话都依赖于所在公司,不符合第三范式、
需分为:
员工编号、员工姓名、员工性别、手机电话
所在公司、公司地点、公司电话
这样才符合第三范式。
反范式:
将有关系的列尽量的放在同一个表,减少表的关联,增加冗余数据。
例:
-
员工编号、员工姓名、员工性别、手机电话、所在公司、公司地点
-
所在公司、公司地点、公司电话
实际上可以通过连表获取所在公司的数据,但是还是将数据放在员工表。
范式的优势:
- 范式的更新更多时候比反范式更快,因为数据更少的重复,所以修改比较少的数据就可以。
- 没有重复的数据就更少的需要分组和去重,执行效率会更快。
- 遵守范式,能消除数据冗余、更新异常、插入异常和删除异常。
范式的劣势:
动不动就要关联,就算找寻很简单的数据可能也要关联多张表,有些可能会引起索引策略失效。
反范式的优势:
避免关联,所以数据都在同一张表,读起来很方便。
反范式的劣势:
数据大量重复、冗余,修改起来很不方便。
设计策略:
混用范式和反范式,使用范式化的schema、缓存表以及其他技巧,使用反范式化的方法是复制或者缓存,在不同的表中存储相同的特定列。