美文网首页商城
三、数据库设计用户表实战

三、数据库设计用户表实战

作者: AKyS佐毅 | 来源:发表于2017-12-26 16:13 被阅读82次

    1、用户模型设计

    • 用户实体


      用户实体.png
    • 思考:如何把用户的属性存在表中?

      • 方案一:将所有的数据都放在一个表中

        • 优点:易于数据存取。
        • 问题: 用户手机号作为主键使用,该用户表包含 会员级别、级别的积分上限,级别积分下限。 那么当我们执行 insert into 用户表(会员级别) values('青铜'),就会出现插入异常。
      • 数据的更新异常

        • 要修改某一行的值时,不得不修改多行数据。比如:当产品需要将 用户等级:青铜级 -->注册会员。此时我们需要执行: update 用户表 set 等级 = '注册会员' where 等级 = '青铜级'。当用户量比较大的时候,会出现相同等级用户不一的情况。更有甚者,锁表的情况也会出现,造成用户无法登陆。
      • 数据的删除异常

        • 删除某一个数据时不得不删除另一个数据。
        • 如何删除用户等级名为青铜的等级? delete from 用户表 where 用户等级 = '青铜'。这样删除会丢失大量的用户。
      • 数据存在冗余

        • 数据表过宽,会影响修改表结构的效率。
    • 如何解决上述的问题呢?

      • 满足 数据库设计范式。最低满足第三范式。

      • 第三范式:一个表中的列和其他列之间既不包含部分函数依赖关系,也不包含传递函数依赖关系,那么这个表的设计就符合第三范式。

      • 登陆名 <--- {用户级别} <--- { 级别的积分上限,级别积分下限} 。这三者之间存在着函数依赖关系。所以不满足第三范式要求。

      • 解决方案: 拆分原用户表以符合第三范式。


      • 尽量做到冷热数据分离,减少表的宽度。

        • 用户登陆表:{登陆名,密码,用户状态}
        • 用户地址表:{省,市,区,邮编,地址}
        • 用户信息表:{用户姓名,证件类型,证件号码,手机号,邮箱,性别,积分,注册时间,生日,会员级别,用户余额}
        • 用户级别信息:{会员级别,级别积分下限,级别积分上限}
    • 用户登陆表(customer_login)

    customer_login
    • 用户信息表
    • 用户级别表


    • 用户地址表


    • 用户积分日志表


    • 用户余额变动表


    • 用户登陆日志表



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

    相关文章

      网友评论

        本文标题:三、数据库设计用户表实战

        本文链接:https://www.haomeiwen.com/subject/hazdgxtx.html