三范式?
- 第一范式:最基本的范式,每列保持原子性,每列不可分
- 第二范式:要有主键,每列都和主键相关
- 第三范式:每列都和主键直接相关,不可存在传递依赖。
三个特点:每列只有一个值;每一列都不可分;每张表不包含其他表已包含的非主键的字段。
比如商品表里面关联商品类别表,那么只需要一个关联字段product_type_id即可,其他字段信息可以通过表关联查询即可。
得到如果商品表还存在一个商品类别名称字段,如product_type_name,那就属于存在传递依赖的情况,第三范式主要是从空间的角度来考虑,避免产生冗余信息,浪费磁盘空间。
三个范式互为基础,第一范式是第二范式的基础,第二范式是第三范式的基础。
反范式设计:(第三范式) 冗余其他表的非主键字段
为什么会有反范式设计?
原因一:提高查询效率(读多写少)
比如上述的描述中,显示商品信息时,经常需要伴随商品类别信息的展示,所以这个时候,为了提高查询效率,可以通过冗余一个商品名称字段,这个可以将原先的表关联查询转换为单表查询
原因二:保存历史快照信息比如订单表,里面需要包含收货人的各项信息,如姓名,电话,地址等等,这些都属于历史快照,需要冗余保存起来,不能通过保存用户地址ID去关联查询,因为用户的收货人信息可能会在后期发生变更