数据库的设计范式
设计范式是数据库设计的规范,有多种设计范式,如数据库设计第一范式,第二范式和第三范式等。数据库设计最低要满足第三范式的要求。
第三范式(3NF)
概念:一个表中的列和其他列之间既不包含部分函数依赖关系,也不包含传递函数依赖关系,那么这个表的设计就符合第三范式。
用一个电商网站的用户所有信息做案例
如下图所示
如果把所有用户属性设计为一个表那么
优点:易于存储。缺点相对来说也是非常大。
缺点1,数据库插入异常
主键为:用户登录名
insert into 用户表(会员级别) value (青铜)
; 因为主键不是自增的。肯定会出现问题
缺点2,数据更新异常
要修改某一行的值时,不得不修改多行数据
用户等级:青铜 —改成–>注册会员
那么修改表语句:update 用户表 set 等级 = 注册会员’ where 等级 = 青铜
缺点3,数据删除异常
删除某一数据时不得不同时删除另一数据。
如何删除用户等级名为青铜的等级? delete from 用户表 where 用户等级= ‘青铜’
缺点4,数据存在冗余 (用户等级积分)
缺点5,数据表过款。
不符合数据设计范式
如图中所示,级别积分上限、下线- 》依赖于 用户级别-》依赖于登录名
设计符合第三范式的用户表
用户表拆分满足要求
1.用户登录表:{登录名,密码,用户状态}
2.用户地址表:{省,市,区,邮编,地址}
3.用户信息表:{用户姓名,证件类型,证件号码,手机号,邮箱,性别,积分,注册时间,生日,会员级别,用户余额}
4.用户级别信息:{会员级别,级别积分下线,级别积分上限}
用户登录表
timestamp类型特点:其他列修改数据时,会自动记录修改时间
用户信息表
用户等级表
用户地址表
用户积分日志表
用户余额变动表
金额用的是 decimal类型
用户登录日志表
像这样的用户登录日志表可以用redis做