数据库规范
- 规范:数据库规范-强制执行
- 行业默认的强规范将不列举在其中。若多次触犯,才考虑添加在此规范中,必要时将上线规范检查工具,强制规范检查。
字符集
- 规范:
- 数据表,字段统一使用 utf8mb4_unicode_ci
- 若需要区分大小写,可选使用 utf8mb4_unicode_cs
- 不遵守的后果
- 字符集不一致,无法使用 = (等号)操作符
- 字符集兼容度不够导致特殊字符无法存储
命名
- 规范
- 表,字段命名需要望文生义,减少文档查阅
- 命名法:蛇形命名法(snake case),示例: aaa_bbb_ccc
- 开头和结尾不允许出现 _
- 不允许出现单字母
- 避免使用 is_ 开头。此类命名可能会被 java 反射误解
- 布尔类命名,必需使用正向含义,值将存储 1是0否,避免产生误解
- 多模块系统,表名按模块统一添加前缀,前缀建议 2~4个字母
- 字段名不建议使用前缀。字段名请避开 mysql 关键字
- 不遵守的后果
- 代码生成工具/框架无法准确映射为实体对象,功能开发需要花费大量人力解决映射问题
- 首尾出现 _ 无法转换为驼峰命名法,或转换之后容易误解,也可能导致代码处理异常
基础字段
- 基础字段:
- ID (id), 此字段必需在首位,下述的其他字段均放在表的最后。
- 排序(sort)
- 创建时间(create_time)
- 创建人(create_by)
- 修改时间(update_time)
- 修改人(update_by)
- 备注(comments)
- 版本号(version)
- 要点
- 基础字段必需全局一致,其他字段不可冲突
其他规范
- 其他规范将作为上述列表规范的补充
序号 | 规范名 | 规范说明 |
---|---|---|
1 | ID | 必须定义主键,默认为ID,整型自增(如果有特殊情况,可商讨后自定义) |
2 | 外键 | 禁止使用外键,一切外键概念必须在应用层解决 |
3 | 小数 | 小数类型用decimal(禁止使用float和double),如果存储的数据范围超过decimal的范围,建议将数据拆成整数和小数分开存储 |
4 | 备注 | 表和字段都要有明确的注释,当定义有修改时,要及时修改注释信息 |
5 | 长度 | varchar长度设计需要根据业务实际需要进行长度控制,可适度预留,禁止预留过长空间,防止后续无法扩充字段 |
6 | 索引 | 积极添加索引,适时使用联合索引。索引字段必不能为 null |
7 | 列含义 | 多表中的相同列,必须保证列定义一致 |
- 业务增长后的一些考虑
方案 | 场景 |
---|---|
数据归档 | 大量冷数据场景,可使用归档方式解决数据量大的问题 |
分库分表 | 若业务数据量庞大,系统不便于拆分,同时有明确的分库/分表条件,可使用分库分表解决 |
更换存储方案 | 若数据无强事务要求,数据量庞大,需要考虑 ES, PG, Mongoo 等存储方案 |
查询规范
- 大量数据查询,必需使用分页。数据量大到无法控制时,需要考虑 id 偏移方式翻页
- 复杂 sql 必需 explain 评估后再执行/上线
- List 查询避免 blob、text 等字段查询
注入风险管理强制
- 原则:注入风险管理强制-强制
- 说明:防止一切注入风险:
- 【重要】orderBy 中使用 ${}。必需使用 setOrderBy 传入,已经添加风险控制
- MBG 的 noValue,singleValue,betweenValue,listValue 注入风险:Example 的 Criteria 产生,无注入风险
- MBG 的 like 注入风险:like 前的由 Example 控制,后的为 #{}, 无注入风险
- 【重要】Custom 实现的 like 强制使用 AND column like concat("%",#{value},"%")