zoukankan      html  css  js  c++  java
  • 电商数据库设计

    电商数据库设计

    围绕购物流程

    mysql5.7
    mysql SQLyog
    Linux Shell脚本

    用户登录-选购商品-加购物车-检查库存-提交订单-货到付款-订单付款-发货

    模块设计

    用户模块 用户注册登录验证
    商品模块 前后台商品管理
    订单模块 订单购物车生成和管理
    仓配模块 仓库库存和物流的管理

    数据库设计规范

    逻辑设计-物理设计
    实际工作中 逻辑设计+物理设计
    表名 字段名 字段类型

    数据库字段设计规范
    -数据库对象名称必须使用小写字段 下划线分隔 DbName not Equal dbname

    -数据库对象禁止使用mysql保留关键字
    select id,username,from,age from tb_user 报错
    select id,username,from,age from tb_user 不报错

    -数据库对象命名见名识意 不超过32字符 用户数据库mc_userdb 用户数据表user_account

    -所有临时表以tmp为前缀并且以日期为后缀

    -备份库 备份表必须以bak为前缀并以日期为后缀

    -所有储存相同数据的列名和列类型必须一致

    -所有表是使用Innodb存储引擎 支持事务 行级锁 更好的恢复性 高并发下性能好

    -数据库和表的字符集统一使用UTF8

    统一字符集可以避免由于字符集转换成的乱码
    -使用comment从句添加表和列的注释 数据字典的维护

    -控制单表数据量的大小 控制在500w行内

    -限制取决于存储设置和文件系统

    -分区表在物理上表现为多个文件 逻辑上为一个表

    -谨慎选择分区键 跨分区效率更低 物理分表方式管理大数据

    -禁止表中使用预留字段

    -禁止在数据库中存储图片 文件等二进制数据

    -禁止线上做数据库压力测试

    -禁止开发测试环境连接生成环境数据库

    索引设计规范
    -限制表索引数量 建议单张表索引不超过5个

    -每个Innodb表必须有一个主键 不能使用频繁更新的列作为主键

    -不使用UUID MD5 HASH 字符串作为主键

    -SELECT UPDATE DELETE语句的WHERE从句中的列包含在ORDER BY,GROUP BY,DISTINCT中的字段多表的关联列

    -避免建立冗余索引和重复

    -对于频繁查询优先考虑覆盖索引

    -尽力避免使用外键

    -外键用于保障数据参照完整性 建议在业务端实现

    数据库字段设计规范
    -优先选择符合存储需要的最小的数据类型

    -将字符串转换为数字类型存储
    INET_ATON('255.255.255.255') = 4294967295
    INET_NTOA(4294967295) = '255.255.255.255'
    (字符串需要15个字节 int只需要4个字节)

    -对于非负数数据采用无符号整型进行存储
    SIGNED INT -2147483648~2147483648
    UNSIGNED INT 0~4213213123

    -VARCHAR(N) 中的N代表的是字符数 不是字节数
    使用UTF-8存储汉字 Varchar(255) = 765个字节

    -避免TEXT BLOG类型数据

    -避免使用ENUM数据类型 (修改用ALTER )

    -尽可能把所有列定义为NOT NULL (索引NULL需要增加额外空间)

    -使用TIMESTAMP或者DATETIME存储时间
    TIMESTAMP 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07
    超出时间用DATETIME

    -数据类型
    财务相关 decimal类型 计算时不会丢失精度

    数据库SQL开发规范
    -充分利用表上已有的索引 避免使用双%号的查询条件 如:a like '%123%'

    -一个sql只能利用到复合索引中的一列进行范围查询

    -使用left join或者not exist优化not in操作

    -设计时 对以后的数据库扩展考虑

    -程序连接不同的数据库

    -为数据库迁移和分库分表留余地

    -禁止使用SELECT * 必须使用 SELCT <字段列表查询> (会消耗更多的CPU和IO以及网络带宽资源) 可以减少表结构表化的影响

    -禁止使用不含字段列表的INSERT语句
    INSERT into t values('a','b','c');
    INSERT into t(c1,c2,c3) values('a','b','c');
    可以减少表结构表化的影响

    -避免使用子查询 可以把子查询优化为join查询(子查询结果集无法使用索引)
    子查询会产生临时表操作 子查询数据量大会严重影响效率

    -避免使用join关联太多表 不要超过5个

    -减少同数据的交互次数
    数据库更适合批量操作
    合并多个相同的操作到一起 可以提高处理效率
    alter table t1 add column c1 int,change column c2 c2 int

    -使用in代替or

    -禁止使用order by rand()随机排序
    会把表中符合条件的数据装载到内存中排序 消耗大量CPU
    推荐程序中获取随机值 然后从数据中获取

    -where从句中禁止对列进行函数转换和计算
    where date(createtime)= '20160901' 会无法使用索引
    改为where createtime >= 20160901 and createtime < '20160902'

    -明显不会有重复值时使用UNION ALL而不是UNION
    union会把所有数据放到临时表中再操作 会去重操作
    union all不会再对结果集重新操作

    -拆分复杂的大sql为小sql

    数据库操作行为规范
    -超过100w行的批量写操作 要分批多次操作
    大批量操作可能会造成严重主从延迟
    避免产生大量日志

    -对于大表使用pt-online-schema-change修改表结构

    -禁止为程序使用的账号使用super

    -程序使用账号只能在一个DB上使用 原则上不能有drop权限

  • 相关阅读:
    Event notifications
    twobin博客样式
    Http协议
    ASP.NET Web API自身对CORS的支持: CORS授权检验的实施
    理解计算机系统3
    游标-Oracle游标汇总
    Oracle10g 回收站及彻底删除table : drop table xx purge
    ora-01031:insufficient privileges
    &&运算符和||运算符的优先级问题 专题
    oracle connect by 和start with
  • 原文地址:https://www.cnblogs.com/weizaiyes/p/7844683.html
Copyright © 2011-2022 走看看