Storage 001 电商数据库设计
【大概流程 】用户登录 》 选购商品 》 加入购物车 》 检查库存 》提交订单 》 选择在线支付 或 选择货到付款 》 发货
【用户模块】注册 登陆
【商品模块】前后台商品管理和浏览
【订单模块】订单及购物车的生成管理
【仓配模块】仓库库存和物流管理
【数据库实际开发模式】直接确立表名 字段 数据类型 。
【数据库设计规范】
Mysql5.5 早期存储引擎 Myisam 表,现代选择 Innodb(支持事务、行级锁、更好的恢复性、高并发)。
统一字符集 UTF-8 (mysql utf-8 汉字占3字节 ,ascii占1字节 )
所有表和字段 都要 comment ,维护数据字典。
【单表数据量】控制在 500万行内,易于修改表结构、备份、恢复 。
【控制手段】历史数据归档、分库分表。
【谨慎使用 mysql 分区表】物理上表现为多个文件,在逻辑上为一个表。选择好分区键可导致跨分区查询效率更低。
【建议物理分表】适合大数据,IO
尽量冷热数据分离,减少表的宽度(最大4096列),
目的减少磁盘IO保证热数据的内存缓存命中率,避免往缓存读入无用的冷数据。
通常表现为 【经常使用的列放到一起,减少关联查询】
预留字段的危害 , 本身数据类型、命名都是模糊的,如果修改预留字段,导致表的锁定,得不偿失。
二进制数据(图片、文件)不是存在数据库的,使用vsftpd +nginx 。
禁止在线上做数据库压力测试,应该用专用压力环境,毕竟有垃圾数据。开发 测试 生产 应该隔离。
① 命名 统一小写字母并用下划线分割。
长度不超过32个字符 库 mc_userdb 表 user_account
临时库表 tmp+日期
备份表 bak+日期
========================================
字段 类型、约束 怎么确定?
~ 尽量所有列 NOT NULL
比较和计算 需要判断
~ 符合需求节省空间
【第一 】将字符串转成数字类型存储 INET_ATON('255.255.255.255') = 429496729,
【第二】不可能负数的 就直接使用无符号类型,多一倍空间,4字节。
【第三】VARCHAR(N) N是字符(N个汉字),而非字节数。 Mysql_UTF8 varchar(255) = 765字节。
~ 避免使用 TEXT BLOB数据类型 ,扔到扩展表中(TEXT 不实用 实际 VARCHAR够了)。
限制:只能用前缀索引
~ 避免使用 ENUM 数据类型
限制:使用ALTER语句修改值
缺点:ORDER BY 效率下降,需要额外操作
~ 避免 用字符串存储日期型数据 , 不能使用日期函数计算比较。
应该:TIMESTAMP(1970~2038年) 或 DATETIME
~ 商业数据 DECIMAL (科学计算才用 float double)
优点:比 bigint 更大
========================================================
② 索引(primary index unique )
单表索引不要超过5个。(降低 Mysql 优化查询效率 导致 插入、更新降低)
~ 充分利用已经有的索引
left join 或 not exists 来优化 not in 操作
Innodb按照 【主键索引】顺序组织表。
【建议使用自增ID值】主键不使用 UUID、MD5、HASH、字符串列,不是顺序增长。
【判断是否加索引经验】
① SELECT UPDATE DELETE 的 WHERE
② ORDER BY 、GROUP BY、DISTINCT 的 字段。
③ 需要 JOIN操作 的关联列。
联合索引列顺序怎么安排?
1 最明确区分放在最左侧
2 长度小的列放在最左侧
3 最频繁的列放在左侧
【频繁的查询 覆盖索引】包含所有查询字段的索引。
避免了 Innodb表进行索引二次查找。
把随机IO变成顺序IO加快查询。
【尽量避免使用外键】不使用外键约束,把关联列建立索引,剩下交给程序。
本身外键用来保证数据参照完整性,但实际还是业务为主/
还会影响 父表和子表的 写操作降低性能。
==============================
③ sql 面向开发人员
【预编译语句】可维护、可分发
PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; SET @a = ; SET @b = ; EXECUTE stmt1 USING @a,@b; DEALLOCATE PREPARE stmt1;
~ 避免数据类型隐式转换
select name,phone from user where id = '111' 导致索引失效。
不同库要不同的账号。
不允许 select * 。
把子查询优化成 join 。(因为子查询结果集无法使用索引、临时表数据量大影响大)
每 join 一份表会产生 join_buffer_size 。
【分页】数据库适合批量一次性操作。
【in 代替 or 】in值不应超过500,有效利用索引。
【不宜 order by rand()】随机排序,全部都放到内存!放到程序去排序。
【WHERE从句使用函数、计算】导致索引失效。
索引X where date(createtime) = '20160901'
索引O where createtime >= '20160901' and createtime < '20160902'
明显没有重复值【Union ALL】 【Union】产生临时表。
MYSQL 一个大sql只能使用一个CPU。
④ 方便运维 数据库操作规范。
【主从延迟】 【大事务】【日志多】超过100万条数据,应该分批多次进行操作。
【大表工具】使用 pt-online-schema-change修改表结构。
【最大连接数限制】允许1个有super权限用户连接 DBA 专用。
程序不能有 drop 权限。
Storage 001 电商数据库设计的更多相关文章
- Storage 002 电商数据库设计
[用户模块] 账户登录:邮箱/用户名/已验证手机 密码 如果将所有字段都放到一张表里存储? 数据插入异常 只想插入一个值的 由于需要主键信息,插入的一行变成新的一行,和原来的记录无关. ...
- ***电商数据库设计参考:ecshop数据库+订单表结构等
ecshop订单表结构ecs_order_info说明 -- 表的结构 `ecs_order_info` CREATE TABLE IF NOT EXISTS `ecs_order_info` ...
- 电商架构设计-通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性
个人观察 1.通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性. 2.单一职责原则SRP,真的很关键,广大程序员需要不断深入理解这个原则. 3.架构图是架构师的重要输出,通过图 ...
- 电商Banner设计背后的12个人性的秘密
- Java电商支付系统实战(一)- 简介
现如今,支付成为热点 对于电商业务,这都是不可或缺的 核心功能剖析 下单->支付 nginx 将用户请求反向代理到我们编写的电商系统 = 下单 之后,点击支付跳转到支付系统,最后对接 通过跳转将 ...
- 常见电商项目的数据库表设计(MySQL版)
转自:https://cloud.tencent.com/developer/article/1164332 简介: 目的: 电商常用功能模块的数据库设计 常见问题的数据库解决方案 环境: MySQL ...
- Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计
Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计 二者服务的对象不一样 目的也是不一样的 商品分类是为商品服务的 用来管理商品 商品类型是为扩展属性服务的 用来管理属性 举例:[转] ...
- Java电商支付系统手把手实现(二) - 数据库表设计的最佳实践
1 数据库设计 1.1 表关系梳理 仔细思考业务关系,得到如下表关系图 1.2 用户表结构 1.3 分类表结构 id=0为根节点,分类其实是树状结构 1.4 商品表结构 注意价格字段的类型为 deci ...
- python-django电商项目-需求分析架构设计数据库设计_20191115
python-django电商项目需求分析 1.用户模块 1)注册页 注册时校验用户名是否已被注册. 完成用户信息的注册. 给用户的注册邮箱发送邮件,用户点击邮件中的激活链接完成用户账户的激活. 2) ...
随机推荐
- VC++6.0
for 循环的小括号中 不可以定义变量 我也是醉了
- 使用.net core构建分布式SAAS系统(目录)
一 前言 二 项目背景 三 项目架构-从单体应用到微服务 四 大数据量下的分库分表 五 缓存处理--进程内缓存与Redis的使用 六 使用MNS队列来流量削峰 七 百万Job的任务调度系统 八 每天1 ...
- TypeError: argument 1 must be an integer, not _subprocess_handle/OSError: [WinError 87]
Error Msg: Traceback (most recent call last): File "c:\python27\lib\site-packages\celery\worker ...
- JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)
前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了, jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得 ...
- C# 如何使用配置文件保存应用程序里的配置数据
引言 我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格式的序列化来保存应用程序配置.这样每次都要建立单独的配置类,并书写读写配置 ...
- Friendly Date Ranges 让日期区间更友好
把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推测出来的信息: 如果 ...
- python面对对象(不全解)
面对对象:以人类为例,人类通用功能:吃喝拉撒,就可以封装成一个类,不同功能:嫖赌毒,就是对象的不同功能.继承,多态… 上码 class Person(object): def __init__(sel ...
- Java的selenium代码随笔(8)
Selenium截图方法一: Selenium中截图类TakeScreenshout,这个类主要是获取浏览器窗体内的内容,不包括浏览器的菜单和桌面的任务栏区域,我们用百度首页来截图,看看截图效果. F ...
- 在windows环境利用celery实现简单的任务队列
测试使用环境: 1.Python==3.6.1 2.MongoDB==3.6.2 3.celery==4.1.1 4.eventlet==0.23.0 Celery分为3个部分 (1)worker部分 ...
- Excel vba中访问ASP.NET MVC项目,记录访问时间,文件名称
每30秒连接一次服务器,连接成功单元格变绿色,连接失败变红色,状态单元格为17行,2列 1,打开excel文件,进入vba编辑器,新建一个modules模块,在里面先写一个每30秒执行一次ConnSe ...