第一范式(INF)
概念:数据表中的每一列都是不可拆分的最小单元,也就是确保每一列的原子性
例子:
这张表中有电话字段,电话字段存储的信息可能有家庭电话,或者是工作电话或者是手机号码,因此表达的信息不准确,所以这个表不满足第一范式,我们可以将电话这个字段拆分成(家庭电话、工作电话、手机)
改完之后,表中所表达的信息就非常明确了。
第二范式(2NF)
概念:在满足1NF的前提下,要求表中所有的列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是一个表只描述一件事情;
例子: 订单表只描述订单相关的信息,所有的字段都必须与主键(订单id)有关,因此不能在同一张表中同时出现订单信息与产品信息,如下图
上面的表中存在的问题:
- 数据冗余,每条记录都含有相同信息
- 插入异常,删除所有订单的时候,就把产品信息全都删除了
- 插入异常,如果产品没有被订,无法记录进数据库
- 跟心异常,调整产品的名称,所有的行都需要进行调整
修正
将表进行拆分
- 订单表
- 产品表
第三范式(3NF)
**概念:**必须先满足第二范式,要求表中的每一列都与主键直接相关 而不是间接相关
**例子:**订单表中需要有客户相关的信息,在分离出客户表之后,订单表中需要有一个用户id即可(外键),而不能有用户表中其他的字段。因为其他的用户信息直接关联用户的id,而不是直接与订单id有关
三范式设计的目的
表格的数据绝对不会出现相同内容的字段,最大程度的节省磁盘空间,但是一旦查询会消耗查询资源,三范式可以最大程度的时间换取空间。