数据库三范式

# 第一范式
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需要定期更新定期检查


原文地址:https://www.cnblogs.com/sugar-k/p/11480346.html