【用户模块】

账户登录:邮箱/用户名/已验证手机

密码

如果将所有字段都放到一张表里存储?

数据插入异常        只想插入一个值的  由于需要主键信息,插入的一行变成新的一行,和原来的记录无关。

数据更新异常  只想更新一个值的时候 不得不更新多行   文件锁机制可能造成用户无法登录。 => 可以把范围缩小到另一张表操作。

数据删除异常  只删一个值    不得不把无关的数据一起删了

核心的问题就在于   【数据冗余出错了!】,

函数依赖   function(arg-1)   <- function (arg0)   <- function(arg1,arg2)

所以需要拆分表 满足第三数据库范式(外键),自然满足第一(二维表)、第二范式(主键)。

拆分表经验 :  经常用是热数据  不经常是冷数据 ,把热数据放一起,单独修改很爽。

【用户级别信息表字段】 会员级别  级别积分下限 级别积分上限。

【用户登陆表字段】登录名 密码 用户状态

【用户地址表】省 市 区 邮编 地址

【用户信息表】用户姓名  证件类型 证件号码 手机号 邮箱 性别  积分  注册时间  生日 会员级别 用户余额。

正常设计数据库表,按照数据流向(闭环核心业务)。

【1用户】登录 =》浏览【2分类】+浏览【3商品】=》加入【4购物车】=》结算【5订单】+【6收货地址】=》【7支付】

=======================================================================

https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html

varchar(M)    M指的的是字符数   根据UTF-8编码 字节数为 3 * M

int(M)          M要配合 zerofill(默认unsigned),前面用0填充 。   要表示status,一般 tinyint 就够了 可以表示 -127~128 ,unsigned 255。

2^8 = 256   2^1 = 2     2^32=42亿

create table customer_login(
customer_id int unsigned AUTO_INCREMENT NOT NULL comment '用户ID', -- int unsigned 不需要负数选择无符号 存储42亿
login_name varchar() not null comment '用户登录名',            -- varchar(20) 20个字符 utf8 20x3 = 60个字节
password char() not null comment 'md5加密密码', -- char(32) 经过md5加密就是32字节字符串
user_stats tinyint not null default comment '用户状态',         -- 表示 -128~127
modified_time timestamp not null default current_timestamp
on update current_timestamp comment '最后修改时间'              -- 使用 mysql自带更新修改时间功能 , 程序上方便很多 primary key pk_customerid(customer_id)
)engine = innodb comment='用户登陆表'
;
create table 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 护照',
mobile_phone int unsigned comment '手机号',
customer_mail varchar(50) comment '邮箱',
gender char(1) comment '性别', -- utf8编码 3字节 1个字符
user_point int not null default 0 commnet '用户积分',
register_time timestamp not null comment '注册时间',
   birthday datetime comment '会员生日',-- datetime 1000-01-01 9999-12-31
   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 commentfid(customer_inf_id)
  
)engine=innodb comment '用户信息表'
;
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 '用户级别信息表'
;
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', -- smallint 2^16 = 65536 16/8 = 2个字节
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)
)enginer=innodb comment '用户地址表'
;
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 '用户字典表'
;

Storage 002 电商数据库设计的更多相关文章

  1. Storage 001 电商数据库设计

    [大概流程 ]用户登录 > 选购商品 > 加入购物车 > 检查库存 >提交订单    >  选择在线支付  或 选择货到付款 > 发货 [用户模块]注册 登陆 [商 ...

  2. ***电商数据库设计参考:ecshop数据库+订单表结构等

    ecshop订单表结构ecs_order_info说明 -- 表的结构 `ecs_order_info`    CREATE TABLE IF NOT EXISTS `ecs_order_info` ...

  3. 电商架构设计-通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性

    个人观察 1.通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性. 2.单一职责原则SRP,真的很关键,广大程序员需要不断深入理解这个原则. 3.架构图是架构师的重要输出,通过图 ...

  4. 电商Banner设计背后的12个人性的秘密

  5. Java电商支付系统实战(一)- 简介

    现如今,支付成为热点 对于电商业务,这都是不可或缺的 核心功能剖析 下单->支付 nginx 将用户请求反向代理到我们编写的电商系统 = 下单 之后,点击支付跳转到支付系统,最后对接 通过跳转将 ...

  6. 常见电商项目的数据库表设计(MySQL版)

    转自:https://cloud.tencent.com/developer/article/1164332 简介: 目的: 电商常用功能模块的数据库设计 常见问题的数据库解决方案 环境: MySQL ...

  7. Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计

    Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计   二者服务的对象不一样 目的也是不一样的 商品分类是为商品服务的 用来管理商品 商品类型是为扩展属性服务的 用来管理属性 举例:[转] ...

  8. Java电商支付系统手把手实现(二) - 数据库表设计的最佳实践

    1 数据库设计 1.1 表关系梳理 仔细思考业务关系,得到如下表关系图 1.2 用户表结构 1.3 分类表结构 id=0为根节点,分类其实是树状结构 1.4 商品表结构 注意价格字段的类型为 deci ...

  9. python-django电商项目-需求分析架构设计数据库设计_20191115

    python-django电商项目需求分析 1.用户模块 1)注册页 注册时校验用户名是否已被注册. 完成用户信息的注册. 给用户的注册邮箱发送邮件,用户点击邮件中的激活链接完成用户账户的激活. 2) ...

随机推荐

  1. 数据加密算法--详解DES加密算法原理与实现

    DES算法简介 DES(Data Encryption Standard)是目前最为流行的加密算法之一.DES是对称的,也就是说它使用同一个密钥来加密和解密数据. DES还是一种分组加密算法,该算法每 ...

  2. saiku环境搭建

    说明:搭建saiku环境,BI展示工具. 环境说明: os:windows7 jdk:jdk1.6.0_43 tomcat:apache-tomcat-7.0.62 saiku:saiku-ui-2. ...

  3. Python-语法模板大全(常用)

    目录 1.怎么存数据 变量: 字符串: 不可变对象 列表: 元组: 字典: 三大容器的遍历方法 2.怎么用数据 数字操作符: 判断循环: 3.函数 4. Python核心编程 4.1. 列表生成器 5 ...

  4. 好程序员web前端分享HTML基础篇

    好程序员web前端分享HTML基础篇,最近遇到很多新手,都会问,如果要学web前端开发,需要学什么?难不难学啊?多久能入门之类的问题?那么今天好程序员就先来给大家分享一下web前端学习路线:HTML基 ...

  5. 《.NET和Java之争》 读后感

    原文地址:https://www.cnblogs.com/adalovelacer/p/dotnet-vs-java.html 这是博客园被推荐上首页的文章,本着好学的心态,点进去拜读... 我也不清 ...

  6. HTTPS中间人攻击实践(原理·实践)

      前言 很早以前看过HTTPS的介绍,并了解过TLS的相关细节,也相信使用HTTPS是相对安全可靠的.直到前段时间在验证https代理通道连接时,搭建了MITM环境,才发现事实并不是我想的那样.由于 ...

  7. Bloom Filter(布隆过滤器)如何解决缓存穿透

    本文摘抄自我的微信公众号"程序员柯南",欢迎关注!原文阅读 缓存穿透是什么? 关于缓存穿透,简单来说就是系统处理了大量不存在的数据查询.正常的使用缓存流程大致是,数据查询先进行缓存 ...

  8. 学习storm实现求和操作

    1 storm求和简单操作 主要逻辑,就是spout发送数据源,blot进行处理数据,主要注意的点就是 spout这有个nextTuple自旋,和使用父类的declare..方法声明要发送到下游的名称 ...

  9. redis 的过期策略都有哪些?内存淘汰机制都有哪些?

    面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当然的认为写进 r ...

  10. nextInt()和nextLine()一起使用时的注意点

    问题原因:nextLine()会把nextInt(),next(),nextDouble(),nextFloat()的结束换行符作为字符串读入,进而不需要从键盘输入字符串nextLine便已经转向了下 ...