数据库规范
- 规范:数据库规范-强制执行
- 行业默认的强规范将不列举在其中。若多次触犯,才考虑添加在此规范中,必要时将上线规范检查工具,强制规范检查。
字符集
- 规范:
- 数据表,字段统一使用 utf8mb4_unicode_ci
- 若需要区分大小写,可选使用 utf8mb4_unicode_cs
- 字符集需要(已经)全局设置,无需在 dml 中设置
- 不遵守的后果
- 字符集不一致,无法使用 = (等号)操作符
- 字符集兼容度不够导致特殊字符无法存储
命名
- 规范
- 表,字段命名需要望文生义,减少文档查阅
- 命名法:蛇形命名法(snake case),示例: aaa_bbb_ccc
- 开头和结尾不允许出现 _
- 不允许出现单字母
- 避免使用 is_ 开头。此类命名可能会被 java 反射误解
- 布尔类命名,必需使用正向含义,值将存储 1是0否,避免产生误解
- 多模块系统,表名按模块统一添加前缀,前缀建议 2~4个字母
- 字段名不建议使用前缀。字段名请避开 mysql 关键字
- 不遵守的后果
- 代码生成工具/框架无法准确映射为实体对象,功能开发需要花费大量人力解决映射问题
- 首尾出现 _ 无法转换为驼峰命名法,或转换之后容易误解,也可能导致代码处理异常
基础字段
| 数据库字段 | 接口字段 | 含义 | 备注 |
|---|---|---|---|
| id | id | 主键 | 此字段必需在首位,下述的其他字段均放在表的最后 |
| ext01 | ext01 | 扩展字段01 | 扩展字段(默认情况下不需要,若存在,默认共01~10个, 不够再单独加) |
| sort | sort | 排序 | 若业务逻辑无需排序时,可全局忽略此字段 |
| create_time | createTime | 创建时间 | 创建时间,前端无需传值,后端自行维护 |
| update_time | updateTime | 修改时间 | 修改时间,前端无需传值,后端自行维护 |
| create_by | createBy | 创建人 | 用户编码,前端无需传值,后端自行维护 |
| update_by | updateBy | 修改人 | 用户编码,前端无需传值,后端自行维护 |
| remark | remark | 备注 | 一般不用于控制业务,只作为数据的备注使用 |
| version | version | 版本号 | 乐观锁控制字段。在 update 相关接口时必传 |
| status | status | 逻辑有效状态 | 不展示给任意业务逻辑。status=1表示有效 |
要点
- 基础字段必需全局一致,其他字段不可冲突
- 布尔类型的含义,均用 1,0 表示。1是0否
- 作为索引的字段,必需 NOT NULL
建表语句示例
sql
CREATE TABLE `auth_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
-- 以下是业务字段
`user_code` varchar(31) NOT NULL DEFAULT '' COMMENT '用户编码',
`username` varchar(63) NOT NULL DEFAULT '' COMMENT '用户名',
`nickname` varchar(63) DEFAULT NULL COMMENT '昵称',
-- 以上是业务字段
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`create_by` varchar(31) DEFAULT NULL COMMENT '创建人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`update_by` varchar(31) DEFAULT NULL COMMENT '更新人',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`version` int NOT NULL DEFAULT '0' COMMENT '版本号',
`status` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'status',
PRIMARY KEY (`id`) USING BTREE,
KEY `user_code` (`user_code`) USING BTREE,
KEY `username` (`username`) USING BTREE
) ENGINE=InnoDB COMMENT='用户';其他规范
- 其他规范将作为上述列表规范的补充
| 序号 | 规范名 | 规范说明 |
|---|---|---|
| 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},"%")