proxy-backend-database
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese数据库规范
数据库规范
表命名
表命名
| 对象 | 规则 | 示例 |
|---|---|---|
| 表名 | | |
| 关联表 | | |
| 字段 | snake_case | |
| 主键 | | — |
| 外键 | | |
| 唯一索引 | | |
| 普通索引 | | |
| 对象 | 规则 | 示例 |
|---|---|---|
| 表名 | | |
| 关联表 | | |
| 字段 | snake_case 蛇形命名 | |
| 主键 | | — |
| 外键 | | |
| 唯一索引 | | |
| 普通索引 | | |
必备字段(BaseDO)
必备字段(BaseDO)
sql
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
creator VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (id)可选:
tenant_id BIGINT NOT NULL COMMENT '租户编号'sql
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
creator VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (id)可选:
tenant_id BIGINT NOT NULL COMMENT '租户编号'字段类型
字段类型
| 用途 | MySQL 类型 | 说明 |
|---|---|---|
| 主键 | | — |
| 金额 | | 单位:分 |
| 精确小数 | | 非金额 |
| 布尔 | | — |
| 枚举/状态 | | 对应 Java 枚举 code |
| 时间 | | 对应 |
| JSON | | 配合 |
| 用途 | MySQL 类型 | 说明 |
|---|---|---|
| 主键 | | — |
| 金额 | | 单位:分 |
| 精确小数 | | 非金额场景 |
| 布尔 | | — |
| 枚举/状态 | | 对应 Java 枚举 code |
| 时间 | | 对应 |
| JSON | | 配合 |
索引规则
索引规则
- 外键字段必须建索引
- 单表索引 <=6 个,联合索引字段 <=4 个
- 联合索引:等值在前,范围在后
- 唯一索引必须包含 /
deleteddeleted_time
- 外键字段必须创建索引
- 单表索引数量 ≤6 个,联合索引包含字段数 ≤4 个
- 联合索引:等值查询字段在前,范围查询字段在后
- 唯一索引必须包含 /
deleted字段deleted_time
DO 模板
DO 模板
java
@TableName("{模块}_{实体}")
@KeySequence("{模块}_{实体}_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class {Entity}DO extends BaseDO {
@TableId
private Long id;
// 业务字段...
}- 必须继承 、用
BaseDO、用@TableName@TableId - 枚举字段 Javadoc 用 引用枚举类
@link - JSON 字段用
@TableField(typeHandler = JacksonTypeHandler.class)
java
@TableName("{模块}_{实体}")
@KeySequence("{模块}_{实体}_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class {Entity}DO extends BaseDO {
@TableId
private Long id;
// 业务字段...
}- 必须继承 、使用
BaseDO注解、使用@TableName注解@TableId - 枚举字段的 Javadoc 需使用 引用对应枚举类
@link - JSON 字段需添加 注解
@TableField(typeHandler = JacksonTypeHandler.class)
Mapper 模板
Mapper 模板
java
@Mapper
public interface {Entity}Mapper extends BaseMapperX<{Entity}DO> {
default PageResult<{Entity}DO> selectPage({Entity}PageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<{Entity}DO>()
.likeIfPresent({Entity}DO::getName, reqVO.getName())
.eqIfPresent({Entity}DO::getStatus, reqVO.getStatus())
.betweenIfPresent({Entity}DO::getCreateTime, reqVO.getCreateTime())
.orderByDesc({Entity}DO::getId));
}
}- 继承 (非原生
BaseMapperX<T>)BaseMapper - 条件用 (自动跳过空值)
xxxIfPresent - 排序默认
orderByDesc(DO::getId)
java
@Mapper
public interface {Entity}Mapper extends BaseMapperX<{Entity}DO> {
default PageResult<{Entity}DO> selectPage({Entity}PageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<{Entity}DO>()
.likeIfPresent({Entity}DO::getName, reqVO.getName())
.eqIfPresent({Entity}DO::getStatus, reqVO.getStatus())
.betweenIfPresent({Entity}DO::getCreateTime, reqVO.getCreateTime())
.orderByDesc({Entity}DO::getId));
}
}- 需继承 (而非原生
BaseMapperX<T>)BaseMapper - 查询条件使用 方法(自动跳过空值条件)
xxxIfPresent - 默认按 进行降序排序
orderByDesc(DO::getId)
SQL 安全
SQL 安全
- MyBatis 用 不用
#{}${} - 多租户自动注入 (框架透明处理)
tenant_id
- MyBatis 中使用 而非
#{}来防止SQL注入${} - 多租户场景下自动注入 (框架透明处理)
tenant_id
性能优化
性能优化
- 禁止 ,用
SELECT *指定字段LambdaQueryWrapper.select() - 批量操作代替循环:/
insertBatchupdateBatch - 大数据分页用游标:
WHERE id > #{lastId} LIMIT n - 只读查询用
@Transactional(readOnly = true) - 事务范围尽量小,不包裹远程调用
- 禁止使用 ,需通过
SELECT *指定查询字段LambdaQueryWrapper.select() - 使用批量操作替代循环单条操作:/
insertBatchupdateBatch - 大数据量分页查询使用游标方式:
WHERE id > #{lastId} LIMIT n - 只读查询添加 注解
@Transactional(readOnly = true) - 事务范围尽量缩小,不要包裹远程调用逻辑
建表 SQL 模板
建表 SQL 模板
sql
CREATE TABLE {模块}_{实体} (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
name VARCHAR(100) NOT NULL DEFAULT '' COMMENT '名称',
status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0-开启,1-关闭',
creator VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='{实体中文名}表';sql
CREATE TABLE {模块}_{实体} (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
name VARCHAR(100) NOT NULL DEFAULT '' COMMENT '名称',
status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0-开启,1-关闭',
creator VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='{实体中文名}表';