proxy-backend-database

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

数据库规范

数据库规范

表命名

表命名

对象规则示例
表名
{模块}_{实体}
snake_case
system_dict_type
关联表
{主表}_{从表}
system_role_menu
字段snake_case
user_id
create_time
主键
id
外键
{关联实体}_id
user_id
唯一索引
uk_{表名}_{字段}
uk_system_dict_type_type
普通索引
idx_{表名}_{字段}
idx_pay_order_merchant_id
对象规则示例
表名
{模块}_{实体}
snake_case 蛇形命名
system_dict_type
关联表
{主表}_{从表}
system_role_menu
字段snake_case 蛇形命名
user_id
create_time
主键
id
外键
{关联实体}_id
user_id
唯一索引
uk_{表名}_{字段}
uk_system_dict_type_type
普通索引
idx_{表名}_{字段}
idx_pay_order_merchant_id

必备字段(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 类型说明
主键
BIGINT AUTO_INCREMENT
金额
INT
单位:分
精确小数
DECIMAL(18,2)
非金额
布尔
BIT(1)
枚举/状态
TINYINT
/
INT
对应 Java 枚举 code
时间
DATETIME
对应
LocalDateTime
JSON
JSON
/
VARCHAR(4096)
配合
JacksonTypeHandler
用途MySQL 类型说明
主键
BIGINT AUTO_INCREMENT
金额
INT
单位:分
精确小数
DECIMAL(18,2)
非金额场景
布尔
BIT(1)
枚举/状态
TINYINT
/
INT
对应 Java 枚举 code
时间
DATETIME
对应
LocalDateTime
JSON
JSON
/
VARCHAR(4096)
配合
JacksonTypeHandler
使用

索引规则

索引规则

  • 外键字段必须建索引
  • 单表索引 <=6 个,联合索引字段 <=4 个
  • 联合索引:等值在前,范围在后
  • 唯一索引必须包含
    deleted
    /
    deleted_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()
    指定字段
  • 批量操作代替循环:
    insertBatch
    /
    updateBatch
  • 大数据分页用游标:
    WHERE id > #{lastId} LIMIT n
  • 只读查询用
    @Transactional(readOnly = true)
  • 事务范围尽量小,不包裹远程调用
  • 禁止使用
    SELECT *
    ,需通过
    LambdaQueryWrapper.select()
    指定查询字段
  • 使用批量操作替代循环单条操作:
    insertBatch
    /
    updateBatch
  • 大数据量分页查询使用游标方式:
    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='{实体中文名}表';