skills/kevinqpeng/proxy-skills/proxy-backend-database

proxy-backend-database

SKILL.md

数据库规范

表命名

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

必备字段(BaseDO)

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

索引规则

  • 外键字段必须建索引
  • 单表索引 <=6 个,联合索引字段 <=4 个
  • 联合索引:等值在前,范围在后
  • 唯一索引必须包含 deleted/deleted_time

DO 模板

@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
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 安全

  • MyBatis 用 #{} 不用 ${}
  • 多租户自动注入 tenant_id(框架透明处理)

性能优化

  • 禁止 SELECT *,用 LambdaQueryWrapper.select() 指定字段
  • 批量操作代替循环:insertBatch / updateBatch
  • 大数据分页用游标:WHERE id > #{lastId} LIMIT n
  • 只读查询用 @Transactional(readOnly = true)
  • 事务范围尽量小,不包裹远程调用

建表 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='{实体中文名}表';
Weekly Installs
4
First Seen
3 days ago
Installed on
opencode4
gemini-cli4
antigravity4
claude-code4
github-copilot4
codex4