ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

高性能可扩展mysql 笔记(二)用户模型设计、用户实体表结构设计、设计范式

2019-10-24 16:54:16  阅读:167  来源: 互联网

标签:customer comment 范式 COMMENT 用户 mysql null id


一、用户模型设计

电商羡慕中用户模型的设计涉及以下几个部分:

                

以电商平台京东的登录、注册页面作为例:

    

用户的基本模块涉及用户的账户名、密码、以及手机号码、所在地等信息。

             

由个人后台信息截图可知,用户的实体信息其实很多,不仅仅是当前页面所看到的,如下图:

                

二、用户实体属性的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)

DROP TABLE IF EXISTS `customer_login`;
CREATE TABLE `customer_login` (
  `customer_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `login_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户登录名',
  `password` char(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'md5加密的密码',
  `user_stats` tinyint(4) NOT NULL DEFAULT '1' COMMENT '用户状态',
  `modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
  PRIMARY KEY (`customer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT='用户登录表';

用户信息表(customer_inf)

create table customer.customer_inf(
	customer_inf_id int unsigned auto_increment not NULL comment '自增主键ID',
  customer_id int unsigned not null comment 'customer_login表的自增ID',
  customer_name varchar(20) not null COMMENT '用户真实姓名',
  identity_card_type TINYINT not null default 1 COMMENT '证件类型:1身份证,2军官证,3护照',
  identity_card_no varchar(20) comment '证件号码',
  mobile_phone int unsigned comment '手机号',
  customer_email varchar(50) COMMENT '邮件',
  gender char(1) comment '性别',
  user_point int not null DEFAULT 0 COMMENT '用户积分',
  register_time TIMESTAMP not null COMMENT '注册事件',
  birthday datetime COMMENT '会员生日',
  customer_level tinyint not null DEFAULT 1 COMMENT '会员级别:1普通会员,2青铜会员,3白银会员,4黄金会员,5钻石会员',
  user_money decimal(8,2) not null default 0.00 COMMENT '用户余额',
  modified_time TIMESTAMP not null DEFAULT CURRENT_TIMESTAMP 
  on update CURRENT_TIMESTAMP COMMENT '最后修改时间',
  primary key pk_customerinfid (customer_inf_id)
) engine=innodb comment '用户信息表'
;

用户级别表(customer_level_inf)

create table customer_level_inf(
	customer_level TINYINT not null auto_increment COMMENT '会员级别ID',
  level_name varchar(10) not null comment '会员级别名称',
  min_point int unsigned not null default 0 comment '该级别最低积分', 
  max_point int unsigned not null DEFAULT 0 COMMENT '该级别最高积分',
  modified_time TIMESTAMP not null DEFAULT CURRENT_TIMESTAMP  
  on update CURRENT_TIMESTAMP comment '最后修改时间',
  PRIMARY key pk_levelid (customer_level)
) engine=innodb comment '用户级别信息表'
;

用户地址表 (customer_addr)

create table customer_addr (
 customer_addr_id int UNSIGNED auto_increment 
 not null comment '自增主键ID',
 customer_id int UNSIGNED not null COMMENT 'customer_login表的自增ID',
 zip smallint not null comment '邮编',
 province smallint not null comment '地区表中省份的id',
 city  smallint not null comment '地区表中城市的id',
 district smallint not null comment '地区表中的区id',
 address varchar(200) not null comment '具体的地址门牌号',
 is_default TINYINT not null comment '是否默认',
 modified_time TIMESTAMP not null default CURRENT_TIMESTAMP 
 on update CURRENT_TIMESTAMP comment '最后修改时间',
 PRIMARY key pk_customeraddid(customer_addr_id)
) engine=innodb comment '用户地址表'
;

用户积分日志表(customer_point_log)

create table customer_point_log(
 point_id int UNSIGNED not null auto_increment comment '积分日志ID',
 customer_id int UNSIGNED not null comment '用户ID',
 source tinyint unsigned not null comment '积分来源:0订单,1登录,2活动',
 refer_number int unsigned not null default 0 comment '积分来源相关编号',   
 change_point SMALLINT not null default 0 comment '变更积分数',
 create_time TIMESTAMP not null comment '积分日志生成时间', 
 PRIMARY key pk_pointid(point_id)
) engine=innodb comment '用户积分日志表'
;

用户余额变动表(customer_balance_log)

create table customer_balance_log(
 balance_id int UNSIGNED not null auto_increment comment '余额日志id',
 customer_id int UNSIGNED not null comment '用户ID',
 source TINYINT UNSIGNED not null DEFAULT 1 COMMENT '记录来源:1订单,2退货单',
 source_sn int UNSIGNED not null COMMENT '相关单据ID',
 create_time TIMESTAMP not null DEFAULT CURRENT_TIMESTAMP COMMENT '记录生成时间',
 amount decimal(8,2) not null DEFAULT 0.00 comment '变动金额',
 PRIMARY key pk_balanceid(balance_id)
) ENGINE=INNODB COMMENT '用户余额变动表'
;

用户登录日志表(customer_login_log)

create table customer_login_log(
 login_id int UNSIGNED not null auto_increment comment '登录日志ID',
 customer_id int UNSIGNED not null COMMENT '登录用户ID',
 login_time TIMESTAMP not null COMMENT '用户登录时间', 
 login_ip int unsigned not null COMMENT '登录IP', 
 login_type TINYINT not null COMMENT '登录类型:0未成功 1成功',
 PRIMARY key pk_loginid (login_id)
) ENGINE=INNODB COMMENT '用户登录日志表'
;

 

标签:customer,comment,范式,COMMENT,用户,mysql,null,id
来源: https://www.cnblogs.com/wushaopei/p/11733167.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有