• DB开发规范---初稿


    1 公共约定

    1.1 存储引擎

    默认统一使用InnoDB引擎

    1.2 字符集设定

    后续新建DB默认使用utf8mb4字符集,校对规则使用utf8mb4_general_bin

    历史DB多使用utf8字符集,此部分不做改动。

    1.3 隔离级别

    统一使用read-committed隔离级别(RDS默认)。

    不采用mysql默认的read-repeated隔离级别。

    1.4 应用访问账号

    应用访问账号由开发和DBA共同协商决定,默认一个DB提供两个账户,命名规则为xxxx_rw和xxxx_ro。

    xxxx为区分区分业务模块的缩写,长度控制在10个字符以内。

    xxxx_rw为业务读写账户,默认权限为insert,update,select。不支持delete权限,delete操作统一使用逻辑删除或者走数据修改流程由DBA完成。

    xxxx_ro为业务只读账户,默认权限为select。

    应用访问账号为配置在应用里的专属账号,任何个人不得使用。

    2 表设计

    2.1 表命名

    1、 所有表名不区分大小写,统一使用小写命名。

    2 、命名规则必须见名知意,命名与业务、产品线等相关联。

    3、表名长度控制在40个字符以内。

    4、 禁止使用mysql关键字,包括且不限于的关键字有:key、values、repeat、use、show、schema、desc。

    5 、临时表必须以tmp为前缀,例如 tmp_test01。

    2.2 表设计

    1、禁止使用外键,触发器。

    2、表必须要有注释,所有字段必须要有注释。

    3、尽量将字段设计成not null的,并维护好not null约束。

    4、设计表时要预估一年的数据增量,若一年数据量上千万(单月数据上几百万),需要考虑数据是否可以分区、是否可以归档处理以及归档策略。

    2.3 字段设计

    1、 所有表必须有三个标准字段

    id char(24) 主键。

    create_time datetime 创建时间,只能在insert时插入now(),不允许自定义数据插入。

    update_time datetime 更新时间,只能在insert或update是更新为now(),不允许自定义数据插入,代码做任何update操作时必须同步更新update_time字段,维护单列索引。

    is_deleted tinyint(1)  是否删除

    2 、存储小数全部使用decimal,不允许出现float、double。

    3、存储时间,全部使用datetime,不再使用timestamp,默认存储到秒。若需要存储到毫秒级别,需要使用datetime(6),毫秒最多保留6位精度,可以根据需要自定义精度,如datetime(3)。

    4、对于vachar(10),长度定义指的是字符长度,一个汉字或者一个字母都是一个字符,尽量准确估算需要的长度

    5、不允许使用text、blob等字段。

    6、不允许使用bit字段,使用tinyint代替。

    7、不允许使用enum、set字段。

    2.4 索引设计

    1、索引命名建议采用包含索引类型、表名、字段名三要素。表名和字段名可以酌情缩写,整个名称长度建议不超过32位。对于普通索引,统一使用idx_前缀,唯一索引使用uk_前缀。

    2、insert时同步维护create_time和update_time,update时维护update_time。update_time字段必须建立一个索引。

    3、尽量建立组合索引,理解mysql组合索引的最左使用原则,比如(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)。

    4、建立组合索引的时候,区分度高的放在前面,查询使用场景多的放在前面。

    5、唯一索引的所有字段必须设置为not null。

    6、单表索引尽量不超过5个,单个索引中的字段数不超过5个。

    7、若建索引不知道如何合适,请与DBA沟通。

    2.5 SQL语句

    1、禁止使用select * ,所有查询必须明确字段名称。

    2、禁止使用子查询,使用join方式代替。

    3、禁止使用左%匹配查询,例如: like "%abc",无法利用到索引。

    4、禁止隐式转换,数值类型禁止加引号;字符串类型必须加引号。

    5、禁止大事务,禁止单条sql进行大量数据更新,会造成从库延迟。单次更新超过10W的更新,需要采用过程分批更新,批次更新单批次不超过500条,批次间sleep不少于0.5s。

    6、insert时必须将create_time和update_time填充为now()

    7、update时必须更新update_time字段为now()。

    8、大数据量查询必须要使用limit进行分页处理,单次查询控制在1000条以内。

    9、尽量使用union all 代替 union

    10、表关联最多不能超过3个,且关联条件必须有匹配的索引。

    11、分区表查询必须要带分区键。

    12、禁止where中对字段进行函数或表达式处理。如where year(update_time) = '2018'。

    13、禁止无where条件的查询,如where 1=1

    14、禁止使用标量子查询。

    15、禁止查询中使用!=、not in。

  • 相关阅读:
    sqlserver查询数据的所有表名和行数
    java内存查看与分析
    jboss中JVM监控
    建设一个能承受500万PV/每天的网站如果计算?
    Java MVC框架性能比较
    struts1,struts2,springMVC终极对比
    struts2的action是线程安全的,struts1的action不是线程安全的真正原因
    浅析Struts1和Struts2的Action线程安全问题
    xml bug之cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration...
    eclipse调试web项目
  • 原文地址:https://www.cnblogs.com/qianjinyan/p/11642118.html
Copyright © 2020-2023  润新知