建表规约
表、字段命名
• 必须使用小写字母或数字
• 禁止出现数字开头
• 禁止两个下划线中间只出现数字
• 不使用复数名词
• 禁用保留字
• 是与否概念的字段,必须使用 is_xxx 的方式命名
数据类型
- 小数类型为 decimal
- 货币数据使用最小货币单位,数 据类型为bigint
- 字符串长度几乎相等使用 char
- varchar长度不要超过 5000
表必备三字段 - id
- create_time
- update_time
建表推荐规约 - 表的命名最好是遵循 “业务名称_表的作用”
- 库名与应用名称尽量 一致
- 如果修改字段含义或对字 段表示的状态追加时,需 要及时更新字段注释
- 字段允许适当冗余,以 提高查询性能,但必须 考虑数据一致
- 单表行数超过 500 万行或 者单表容量超过 2GB,才 推荐进行分库分表
索引规约
索引命名
-
主键索引名为 pk_字段名
-
唯一索引名为 uk_字段名
-
普通索引名则为 idx_字段名
创建索引规约 -
有唯一特性的字段必须建成唯一 索引
-
在 varchar 字段上建立索引时, 必须指定索引长度
-
建组合索引的时候,区分度最高的在最左边。
SQL规约
索引
- 防止因字段类型不 同造成的隐式转 换,导致索引失效
- 利用覆盖索引来进 行查询操作,避免 回表
- 如果有 order by 的 场景,请注意利用 索引的有序性
- 页面搜索严禁左模 糊或者全模糊,如 果需要请走搜索引 擎来解决。
count
- 不要使用 count(列名) 或 count(常量)来替代 count(*)
- count(distinct col) 计算该列除 NULL 之外的 不重复行数
- 当某一列的值全是 NULL 时,count(col) 的返回结果为 0,但 sum(col)的返回结果 为NULL
分页
- 若 count 为 0
- 分页查询逻辑时,若 count 为 0 应直接返回
- 优化超多分页场景
- 利用延迟关联或者子查 询优化超多分页场景
null值
- 使用 ISNULL()来判断是否为 NULL 值
- NULL< >NULL NULL< >NULL 的返 回结果是 NULL, 而不是 false
- NULL=NULL NULL=NULL 的返回 结果是 NULL, 而不是 true
- NULL< >1 NULL< >1 的返回结 果是 NULL, 而不是 true
必坑指南
- 不得使用外键与级联,一切外键概念必 须在应用层解决
- 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性
- 数据订正时,要先 select,避免出现误 删除,确认无误才能执行更新语句
- 只要涉及多个表,都需要在列名前 加表的别名(或表名)进行限定
- in 后边的集合元素数量,控制在 1000 个之内
- SQL 语句中表的别名前加 as,并且 以 t1、t2
ORM映射规约
- 在表查询中,一律不要使用 * 作为查询的字段列表
- POJO 类的布尔属性不能加 is,而数据库字段 必须加“is_”
- 查询返回结果都需要使 用ResultMap映射
- 不要使用${}
- 不要使用MyBatis 自带 的 queryForList方法
- 不允许直接使用 HashMap 与 Hashtable 接收结果集
- 更新数据表记录时,必须同时更新update_time
- 不要写一个大而全的数 据更新接口