基础规约
1 【强制】必须使用InnoDB存储引擎
2 【强制】必须使用UTF8字符集,是否有表情考虑使用UTF8mb4
3 【强制】数据表、数据字段必须加入中文注释
4 【强制】禁止存储大文件或者大照片
6【强制】表必备字段:id, create_id,create_time,update_id, update_time,dept_id,dept_code,tenant_id。 说明:其中id必为主键,类型为unsigned bigint、单表时自增、步长为1。create_time, update_time 的类型均为 date_time 类型,update_id,create_id为创建人和修改人的id,dept_id为数据归属部门ID,dept_code为数据归属部门code,tenant_id为租户ID。
7 【强制】库名、表名、字段名:小写,下划线风格,不超过32个字符,必须见名知意,禁止拼音英文混用
8 【强制】表名必须使用子系统加模块作为前缀例如:base_sys_user,crm_customer_main,wms_product_main
9 【强制】业务表必须有主键,没有特殊原因就是自增主键,关联表可以没有主键
10 表间关系尽量不做物理约束
11 【强制】禁止在表中做预留字段
索引规约
9【强制】在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据 实际文本区分度决定索引长度。
10 禁止在更新十分频繁、区分度不高的属性上建立索引,例如性别
a)更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能
b)“性别”这种区分度不大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似
11 建立组合索引,必须把区分度高的字段放在前面
12 单索引字段数不允许超过5个
13 【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。
禁止使用 like ‘%xxx%’, 改为 like 'xxx%'
14 【推荐】建组合索引的时候,区分度最高的在最左边。
SQL 使用规约
15 【强制】不要使用 count(列名)或 count(常量)来替代 count(),count()就是 SQL92 定义 的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
16 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
17【强制】禁止(极少)用存储过程、视图、触发器、Event存储过程难以调试和扩展,更没有移植性。影响性能,CPU能力上移
*18 禁止使用SELECT ,只获取必要的字段,需要显示说明列属性
19 禁止使用属性隐式转换全是数字的字符字段也要加上引号
20 禁止在WHERE条件的属性上使用函数或者表达式会导致全表扫描
21 禁止大表使用JOIN查询,禁止大表使用子查询
模块中尽量少用。需要 join 的字段,数据类型保持绝对一致;多表关联查询 时,保证被关联的字段需要有索引。
其他模块中的表禁止join,必须通过接口获取数据
ORM规约
22【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。
说明:1)增加查询分析器解析成本。2)增减字段容易与 resultMap 配置不一致。
23 POJO 类的 boolean 属性不能加 is,而数据库字段必须加 is_,要求在 resultMap 中 进行字段与属性之间的映射。
24 【强制】不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需 要定义;反过来,每一个表也必然有一个与之对应。
说明:配置映射关系,使字段与 DO 类解耦,方便维护。
25 【强制】xml 配置中参数注意使用:#{},#param# 不要使用${} 此种方式容易出现 SQL 注 入。
26【强制】iBATIS自带的queryForList(String statementName,int start,int size)不推 荐使用。
27 【强制】不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出。
28【强制】更新数据表记录时,必须同时更新记录对应的 gmt_modified 字段值为当前时间。