高性能可扩展MySQL数据库设计及架构优化——电商实例数据库结构

高性能可扩展MySQL数据库设计及架构优化——电商实例数据库结构设计

电商实例数据库结构设计

[var1]

1、用户模型设计

(1) 主要作用:管理和维护用户信息。

2、用户实体

思考:如何把用户的属性存到表中?

优点:易于数据存取

问题:

(1) 数据插入异常

PK:用户登录名

用户表:{登录名 ... ... 会员级别,级别积分上限,级别积分下限}

insert into 用户表(会员级别) values('青铜');

(2) 数据更新异常

要修改某一行的值时,不得不修改多行数据。

用户等级:青铜级 ----> 注册会员

Update 用户表 set 等级 = '注册会员' where 等级 = '青铜级';

(3) 数据删除异常

删除某一数据时不得不同时删除另一数据

如何删除用户等级名为青铜的等级?

delete from 用户表 where 用户等级='青铜';

(4) 数据存在冗余(很容易出现相同级别,级别的上限和下限不同的情况)

(5) 数据表过宽,会影响修改表结构的效率

解决方式:

(1) 数据库的设计范式

设计范式是数据库设计的规范;

有多种设计范式,如数据库设计第一范式,第二范式和第三范式等

数据库设计最低要求满足第三范式的要求。

(2) 第三范式(3NF)

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

{级别积分上限,级别积分下限}与{登录名}之间存在传递依赖关系,不符合第三范式

(3) 拆分原用户表以符合第三范式

(4) 尽量做到冷热数据分离,减少表的宽度

用户登录表:{登录名,密码,用户状态}

用户地址表:{省,市,区,邮编,地址}

用户信息表:{用户名,证件类型,证件号码,手机号,邮箱,性别,积分,注册时间,生日,会员级别,用户余额}

用户登录表(customer_login):

CREATE TABLE customer_login(

customer_id int UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '用户ID',

login_name VARCHAR(20) NOT NULL COMMENT '用户登录名',

password char(32) not null COMMENT 'md5加密的秘钥',

user_stats TINYINT NOT NULL DEFAULT 1 COMMENT '用户状态',

modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

PRIMARY KEY pk_customerid(customer_id)

) ENGINE = INNODB COMMENT = '用户登录表';

用户信息表(customer_inf):

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 护照',

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',

customer_name VARCHAR(10) NOT NULL COMMENT '会员级别名称',

min_point INT UNSIGNED NOT NULL DEFAULT 0 COMMIT '该级别最低积分',

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_customerlevelid(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 COMMIT '地区表中的区id',

address VARCHAR(200) NOT NULL COMMIT '具体的地址门牌号',

is_default TINYINT NOT NULL COMMENT '是否默认',

modified_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',

PRIMARY KEY pk_customeraddrid(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 '积分来源: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 '用户登录日志表';

[var1]

[var1]

[var1]

[var1]

[var1]

[var1]

[var1]

高性能可扩展MySQL数据库设计及架构优化——电商实例数据库结构相关教程

mysql电商数据库结构_高性能可扩展MySQL数据库设计及架构优化——电商实例数据库结构...相关推荐

  1. 电商数据库设计及架构优化实战(一) - 制定数据库开发规范

    2 准备工作 3 项目说明 4 数据库设计规范 5 数据库命名规范总结 6 数据库基础设计规范 总结 7 数据库索引设计规范 转载于:https://juejin.im/post/5c35af49e5 ...

  2. 从MySQL中导出表中数据_用命令从mysql中导出/导入表结构及数据

    在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看: mysqldump 最常用的: mysqldump -uroot -pmysql databasefo ...

  3. mysql数据库字符集_超详细的MySQL数据库字符集总结,值得收藏

    MySQL支持多种字符集(character set)提供用户存储数据,同时允许用不同排序规则(collation)做比较.下面基于MySQL5.7介绍一下字符集相关变量的使用. 一.字符集.字符序的 ...

  4. mysql 5.0 修改字符集_修改及查看mysql数据库的字符集

    Liunx下修改MySQL字符集: 1.查找MySQL的cnf文件的位置 find / -iname '*.cnf' -print /usr/share/mysql/my-innodb-heavy-4 ...

  5. java导出mysql数据库失败_利用Java进行MySql数据库的导入和导出

    利用Java来进行Mysql数据库的导入和导出的总体思想是通过Java来调用命令窗口执行相应的命令. MySql导出数据库的命令如下: mysqldump -uusername -ppassword  ...

  6. 修改mysql数据库字符集_修改及查看mysql数据库的字符集

    Liunx下修改MySQL字符集: 1.查找MySQL的cnf文件的位置 find / -iname '*.cnf' -print /usr/share/mysql/my-innodb-heavy-4 ...

  7. mysql 如何按时间备份_如何定时备份mysql数据库

    第一步:编写mysqldump备份数据库脚本,先新建txt文档,编辑内容为 @echo off set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" ...

  8. mysql binlog更新记录缺失_记一次mysql数据库binlog丢失引起的故障

    线上某业务需要对日志信息入库并进行分析最后呈现在管理后台上.某天突然发现后台没有前一天的分析数据.首先认为是java程序问题,于是查看应用程序日志,发现数 线上某业务需要对日志信息入库并进行分析最后呈 ...

  9. php如何查询mysql数据库字符集_修改及查看mysql数据库的字符集_MySQL

    bitsCN.com Liunx下修改MySQL字符集: 1.查找MySQL的cnf文件的位置find / -iname '*.cnf' -print /usr/share/mysql/my-inno ...

  10. 启动mysql 数据库服务器_启动及关闭MySQL服务器的正确方式

    启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysql/bin mys ...

最新文章

  1. 区块链为什么这么热?有这么大热度的原因是什么
  2. Dell 原有PowerEdge 服务器型号获得通过 Red Hat Enterprise Linux 6 认证
  3. 前端技术演进(三):前端安全
  4. BC:带你温习并解读《中国区块链技术和应用发展白皮书》—区块链发展生态
  5. struts2:多业务方法的处理(动态调用,DMI)
  6. async 和 await的前世今生 (转载)
  7. retext代码高亮_实例简介Markdown格式
  8. Linux下使用rsync同步文件
  9. 王朔:中国文化沉淀了大量腐烂变质垃圾
  10. 机器人抓取中物体3D定位算法介绍
  11. unity光源自带的Halo效果
  12. 2007年度中文博客百条经典语录
  13. Cassandra Vs Voldemort
  14. html页面如何拉长,HTML可以拉长的logo
  15. 核心业务2:借款人申请借款额度
  16. 前端转换为pdf的方法之一
  17. 实现图片跟随鼠标移动
  18. Python的re库和正则表达式
  19. jquery.flot 在节点上显示提示
  20. python批量修改列名_pandas修改DataFrame列名的实现方法

热门文章

  1. 考CFA证书只通过一级有用吗?
  2. JTopo交互式拓扑图(基本使用+常用场景)
  3. 计算机辅助设计 Photoshop 教案,计算机辅助设计①Photoshop学习领域课程标准.doc
  4. 应该怎样读TAOCP
  5. Scala语言精华版笔记整理
  6. UML用例图的画法详细介绍【软件工程】
  7. SAXReader解析
  8. JAVA:实现HillCipher希尔密码算法(附完整源码)
  9. SECS Message解析说明
  10. Ubuntu1804_server 离线安装GCC_7.5