【大概流程 】用户登录 》 选购商品 》 加入购物车 》 检查库存 》提交订单    》  选择在线支付  或 选择货到付款 》 发货

【用户模块】注册 登陆

【商品模块】前后台商品管理和浏览

【订单模块】订单及购物车的生成管理

【仓配模块】仓库库存和物流管理

【数据库实际开发模式】直接确立表名 字段 数据类型 。

【数据库设计规范】

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 电商数据库设计的更多相关文章

  1. Storage 002 电商数据库设计

    [用户模块] 账户登录:邮箱/用户名/已验证手机 密码 如果将所有字段都放到一张表里存储? 数据插入异常        只想插入一个值的  由于需要主键信息,插入的一行变成新的一行,和原来的记录无关. ...

  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. WebApi 身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

  2. Java中String、StringBuilder、StringBuffer的区别

    常量还是变量: String是字符串常量(以final修饰符进行修饰,不可更改): StringBuilder是字符串变量 StringBuffer是字符串变量 线程安全: String无所谓线程安全 ...

  3. 周一04.2流程控制if……else

    语法一:  if 条件1: 代码1 代码2 例题:如果年龄>20岁,那么:叫阿姨 age=22if age>20: print('阿姨') 语法二: if 条件1: 代码1 代码2else ...

  4. python3 购物车 增改查终极版~

    还是先来条NLP再说,快没了,以后想抄还没有... 十一,没有挫败,只有回应讯息 “挫败”只是指出过去的做法得不到预期的效果,是给我们需要改变的信号. “挫败”只是在事情画上句号时才能用上,欲想事情解 ...

  5. java学习札记

    java学习札记 0x0 学习原因  本来打算大三再去跟着课程去学习java的,但是现在题目越来越偏向java,所以迫于无奈开启了java的学习篇章,同时也正好写个笔记总结下自己学习一门语言的流程. ...

  6. python小白——进阶之路——day2天-———数据类型和Number类型和str字符串

    ### -python的六大标准数据类型(1)Number 数字类型(int float bool complex)(2)String 字符串类型(3)List 列表类型(4)Tuple 元组类型(5 ...

  7. [原创]Java应用性能远程监控系统(C/S架构)

    Java应用性能远程监控系统(使用C/S架构) 适用于监控所有Java应用,具有堆内存监控.方法区监控.GC监控.类加载监控.类编译监控与线程监控,提供堆快照下载,线程快照下载.体验网址:http:/ ...

  8. centos 6.8 配置 Redis3.2.5

    配置Redis3.2.5 与 php-redis 一.配置Redis 1.下载Redis3.2.5安装包 [root@zhangsan /] wget http://download.redis.io ...

  9. 查看dll或lib中包含的函数

    这个功能主要用于检测是否包含自己所需的函数,可能在解决 error LNK2019 时会用到. dumpbin /exports avcodec.lib /out:test.txt

  10. win 解压安装mysql步骤

    5  安装成功之后,启动mysql时报错: 系统错误2,找不到指定的文件.原因:有的系统安装过MySQL没有卸载干净,或者系统自带精简版的MySQL导致注册表关于MySQL的配置与实际安装路径不一致. ...