# 第一范式
1 数据库表的每一列都不可再分,即不能有重复值。
2属性不能重复
3解决办法
拆分多个表
# 第二范式
1首先要满足第一范式
2非主键字段需要完全依赖主键
3主要针对复合主键
eg
订单表
订单编号 种类 数量 时间
1 铅笔 2 0
2 钢笔 3 1
3 墨水 2 2
用户表
id 订单编号 username zhuangtai
1 1 a y
1 2 a n
2 3 c y
如果id和订单编号为复合主键
状态完全依赖于主键
但是用户名只依赖id
因此不满足第二范式
存在的问题
1修改一个用户订单时需要修改多条记录
2当一个用户没有下单时不能插入数据
3删除用户的订单会将用户一起删除
解决思路
1关键在于用户名没有依赖复合主键
2将用户名移除并与id新建一张表
3其余属性合并
eg
id username
1 a
2 c
# 第三范式
1必须在满足第二范式的情况下
2其余字段之间不存在依赖性
eg
id username grade discount
1 a a 0.9
2 b b 0.8
3 c a 0.9
存在的问题
可以看到虽然其余三个属性依赖主键id字段
但是非主键字段grade discount之间存在依赖关系
缺陷:
1输入数据时会导致 如果出现没存在的grade那么discoun 也无处可知
2删除某一个等级下的所有数据时对应的折扣也将被删除
3修改某一数据时,对grade修改同时意味着对discount的修改
解决思路:
将这对依赖关系独立建表
grade discount
a 0.9
b 0.8
# 范式的优缺点
优点
1降低了数据的冗余
2提高了数据的增删改的可靠性
缺点
1增加了表的数量
2降低了查询的效率
# 反范式
1直接在表中添加字段
2会出现数据不一致的问题
3需要定期更新定期检查