# SQL开发规范
- 表
- 每张表需加注释 - 工具可直接生成 
- 表名使用蛇形命名方式 
- 每张表必须有主键,尽量使用单字段主键 
- 建议数据删除用软删 
- 每个table加上created_at 、updated_at、deleted_at,以便于查找问题 
- 操作多条数据必须加上事务以保证数据的完整性 
- 不建议使用外键,外键会增加表结构变更和数据迁移的复杂性,新增时会增加主外键约束检查而影响性能,数据完整性由程序控制 
- 禁止在数据库做复杂的计算 
- 查询大量数据必须使用分页,在明确知道数据量小的情况下才能全量查询 
- 尽量避免使用or,对于or运算符,通常会使用全表扫描,考虑用分解查询使用union all / union 来实现,需要确认查询能使用到索引并返回较少的结果集 
- 限制使用join,单个语句不超过5个,join会降低性能 
- 禁止应用程序循环里面带有数据库操作,在能确定循环次数少的情况下才可使用 
- 不建议使用视图,视图并没有提高查询效率 
- 字段
- 字段名使用蛇形命名 
- 布尔字段建议用 is_ 、has_、does_ 开头,日期字段以 _date 结尾 ,日期+时间格式字段以 _at 结尾 
- 每个字段需加注释 - 工具可直接生成 
- 相同字段在不同的table里命名需要统一,类型也统一 
- 表字段默认值尽量避免使用null,因为使用NULL值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果偏差等问题 
- json或者jsonb字段,数据量大的情况下 建议拆分出来存放在另外一张table 
- 索引
- 索引命名规范,主键索引pk_开头,唯一索引 uk_ 开头,普通索引 idx_ 开头 
- 对where后面的条件经常使用的列需要增加索引 
- 单表索引数不超过6个 
- 索引包含的字段不超过5个 
- 不适合创建索引的字段 比如 性别,值为0/1 或者 true/false 
- 禁止在索引列上使用函数或计算 
- 禁止查询指定索引 
- 版本更新
- 开发人员在开发时记录需要更改的SQL语句,在测试环境上使用后确保语句执行没问题 
- 版本更新时,开发人员把执行的SQL语句发给运维人员 
- 运维人员根据SQL语句执行线上数据库更新,并把执行后的SQL语句在服务器上存档 
