高性能可扩展mysql 笔记(二)用户模型设计、用户实体表结构设计、设计范式
个人博客网:https://wushaopei.github.io/ (你想要这里多有)
一、用户模型设计
电商羡慕中用户模型的设计涉及以下几个部分:
以电商平台京东的登录、注册页面作为例:
用户的基本模块涉及用户的账户名、密码、以及手机号码、所在地等信息。
由个人后台信息截图可知,用户的实体信息其实很多,不仅仅是当前页面所看到的,如下图:
二、用户实体属性的CRUD操作的问题分析
1、当我们确定了需要保存用户的属性后,就需要考虑怎么将属性存到表中了?同时还要考虑保存数据时的一些问题以及优劣性分析!
在将数据进行保存操作时会出现如下几个问题:
1、数据插入异常
PK : 用户登录名
用户表 :{登录名 ... ... 会员级别,级别积分上限,级别积分下线}
insert into 用户表(会员级别)values(`青铜`);
2、数据更新异常
要修改某一行的值时,不得不修改多行数据
例: 用户等级: 青铜级 —> 注册会员
update 用户表 set 等级= `注册会员` where 等级= `青铜级`
3、数据删除异常
删除某一数据时不得不同时删除另一数据
例: 如何删除用户等级名为青铜的等级
delete from 用户表 where 用户等级=`青铜`;
4、数据存在冗余
5、数据表过宽,会影响修改表结构的效率
三、用户实体属性的操作问题的解决方式
遵守数据库的设计方式:
- 设计方式是数据库设计的规范
- 有多种设计范式,如数据库设计第一范式,第二范式和第三范式
- 数据库设计最低要满足第三范式的要求
1、第三范式(3NF)的定义
一个表中的列和其他列之间既不包括部分函数依赖关系,也不包括传递函数依赖关系,那么这个表的设计就符合第三范式。
2、根据第三范式(3NF)优化拆分用户表
这里根据范式将第一张表中的会员级别、级别积分上限、级别积分下线进行拆分成一个小表,因为用户的个人信息修改的频率不高,而用户的级别可能随着时间、经验值等的提升而经常变动,单独拆分出来可以避免对冷数据的重复检索、节约IO资源。
3、根据第三范式设计好的表如下:
用户登录表(customer_login)
用户信息表(customer_inf)
用户级别表(customer_level_inf)
用户地址表 (customer_addr)
用户积分日志表(customer_point_log)
用户余额变动表(customer_balance_log)
用户登录日志表(customer_login_log)