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。

DB开发规范---初稿的更多相关文章

  1. ***网Web前端开发规范(初稿)

    这几天一直在梳理关于前端方面的开发规范,现在暂时梳理了HTML的开发规范,暂且放置于此! 规范目的: 使开发流程更加规范化 文件命名规范:(需审批) 1.项目命名 全部采用小写方式, 以下划线分隔. ...

  2. PHP开发规范

    十.开发规范下面我们讲解 Yii 编程中推荐的开发规范.为简单起见,我们假设 WebRoot 是 Yii 应用安装的目录.1.URL默认情况下,Yii 识别如下格式的 URL: http://host ...

  3. MySQL生产库开发规范

    MySQL开发规范 文件状态: [  ] 草稿 [√] 正式发布 [  ] 正在修改 文件标识:   当前版本: V1.0  作    者: 贺磊  完成日期: 2016-05-24 变更记录 序号  ...

  4. MySQL数据库开发规范知识点

    前言: 设计规范更多的是为了确保数据库设计的合理性.为了项目最终的协调稳定性,而命名规范则更多的是为了确保设计的正式和统一. 约定优先于配置(Convention Over Configuration ...

  5. MySQL之开发规范

    一..数据库命名规范 1.所有数据库对象名称必须使用小写字母并用下划线分割 2.所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 3.数据库对象的命 ...

  6. import模块/包--软件开发规范

    一. 模块 模块:就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译 ...

  7. python之模块、包的导入过程和开发规范

    摘要:导入模块.导入包.编程规范 以My_module为例,My_module的代码如下: __all__ = ['name','read'] print('in mymodule') name = ...

  8. Python模块的导入以及软件开发规范

    Python文件的两种用途 1 . 当脚本直接使用,直接当脚本运行调用即可 def func(): print("from func1") func() 2 . 当做模块被导入使用 ...

  9. python 全栈开发,Day29(昨日作业讲解,模块搜索路径,编译python文件,包以及包的import和from,软件开发规范)

    一.昨日作业讲解 先来回顾一下昨日的内容 1.os模块 和操作系统交互 工作目录 文件夹 文件 操作系统命令 路径相关的 2.模块 最本质的区别 import会创建一个专属于模块的名字, 所有导入模块 ...

随机推荐

  1. LeetCode_448. Find All Numbers Disappeared in an Array

    448. Find All Numbers Disappeared in an Array Easy Given an array of integers where 1 ≤ a[i] ≤ n (n  ...

  2. js小数计算的问题,为什么0.1+0.2 != 0.3

    //下面可以用原生解决 0.1+0.2 的问题 parseFloat((0.1 + 0.2).toFixed(10)) 复制代码 console.log(0.1+0.2===0.3); //true ...

  3. Arch Linux 启用 MTU 探测

    最近在家里经常遇到 ssh 超时的问题,一开始也没太当回事,感觉是网络不稳定导致的,但是后来慢慢的发现这种超时问题只会出现在跟 ssh 相关的程序中,例如 git.ssh.这成功的引起了我的注意,于是 ...

  4. “无法从节点xx检索exectask的版本” 原因分析

    客户有一套部署在Window 2008 R2 sp环境下的12.1.0.2 RAC环境,该RAC基于策略管理.因为业务需要,现在需要更换部分设备——踢出两台2路的服务器(节点名称分别为racnode2 ...

  5. [QT] - 图片查看器(数码相框)#工程源码

    简介: 大学期间弄的一个小软件,当时是将该软件移植到嵌入式开发板使用的,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 打开软件 ] [ 打开图片 ] [ 图片可放大. ...

  6. [Linux] 树莓派 4B 安装 Ubuntu 19.10 (Eoan Ermine) IOT 版

    硬件:Raspberry Pi 4B系统:Ubuntu 19.10 (Eoan Ermine) for IOT官网:https://ubuntu.com/download/iot/raspberry- ...

  7. PHP 使用 pdo 操作oracle数据库 报错

    ## SELECT UNID,NAME,NAME_XML WHERE UNID>=10 AND UNID<=15 ## 在10到15这5条数据中不为空数据php: symbol looku ...

  8. C# vb .net实现颜色替换效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的颜色替换效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  9. 洛谷【P1048 采药】题解

    题目链接 分析:典型的01背包问题,设dp[i][j]为空间(也就是题面中的时间)是j的背包在装前i个物品(草药)所得的最大价值,v[i]为第i个物品的重量(采药的时间),w[i]为第i个物品(草药) ...

  10. 回归写博客时间-----CeliaTodd

    2019-10-17-19:28:01 记录自己的学习路程 国庆期间本来是有持续写博客的,但是有各种原因就没时间写博客了, 但是学习的进度还是没有落下的,现在正式回归写博客的时间了. 但现在不是写Py ...