1、用户模型设计
-
用户实体
用户实体.png
-
思考:如何把用户的属性存在表中?
-
方案一:将所有的数据都放在一个表中
- 优点:易于数据存取。
- 问题: 用户手机号作为主键使用,该用户表包含 会员级别、级别的积分上限,级别积分下限。 那么当我们执行 insert into 用户表(会员级别) values('青铜'),就会出现插入异常。
-
数据的更新异常
- 要修改某一行的值时,不得不修改多行数据。比如:当产品需要将 用户等级:青铜级 -->注册会员。此时我们需要执行: update 用户表 set 等级 = '注册会员' where 等级 = '青铜级'。当用户量比较大的时候,会出现相同等级用户不一的情况。更有甚者,锁表的情况也会出现,造成用户无法登陆。
-
数据的删除异常
- 删除某一个数据时不得不删除另一个数据。
- 如何删除用户等级名为青铜的等级? delete from 用户表 where 用户等级 = '青铜'。这样删除会丢失大量的用户。
-
数据存在冗余
- 数据表过宽,会影响修改表结构的效率。
-
-
如何解决上述的问题呢?
-
满足 数据库设计范式。最低满足第三范式。
-
第三范式:一个表中的列和其他列之间既不包含部分函数依赖关系,也不包含传递函数依赖关系,那么这个表的设计就符合第三范式。
-
登陆名 <--- {用户级别} <--- { 级别的积分上限,级别积分下限} 。这三者之间存在着函数依赖关系。所以不满足第三范式要求。
-
解决方案: 拆分原用户表以符合第三范式。
-
尽量做到冷热数据分离,减少表的宽度。
- 用户登陆表:{登陆名,密码,用户状态}
- 用户地址表:{省,市,区,邮编,地址}
- 用户信息表:{用户姓名,证件类型,证件号码,手机号,邮箱,性别,积分,注册时间,生日,会员级别,用户余额}
- 用户级别信息:{会员级别,级别积分下限,级别积分上限}
-
-
用户登陆表(customer_login)

- 用户信息表

-
用户级别表
-
用户地址表
-
用户积分日志表
-
用户余额变动表
-
用户登陆日志表

微信扫码关注java技术栈,获取Java面试题和架构师相关题目和视频。
网友评论