# 07-数据库规范 ## 概述 本规范基于项目现有代码实现,规定了数据库设计、表结构、字段命名、数据类型映射等相关规范。所有规范必须与现有代码保持一致,不得引入未实现的设想。 ## 数据库选择 - 使用 MySQL 数据库。 - 连接配置支持 HikariCP 连接池。 - 启用 `map-underscore-to-camel-case` 配置,实现数据库下划线字段与 Java 驼峰属性自动映射。 ## 表命名规范 - 表名采用小写字母,以 `t_` 开头,后跟模块名和实体名,使用下划线分隔单词。 - 示例:`t_user_info`、`t_user_token`。 ## 字段命名规范 - 字段名采用小写字母,使用下划线分隔单词,与 Java 属性驼峰命名对应。 - 示例:`user_id`、`create_time`、`wx_openid`。 ## 主键规范 - 所有表使用 `id` 作为主键字段,类型为 `BIGINT`。 - 使用 MyBatis-Plus 的 `ASSIGN_ID` 策略(雪花算法生成 ID)。 - 在实体类中使用 `@TableId(value = "id", type = IdType.ASSIGN_ID)` 注解。 ## 公共字段规范 - 所有实体类继承 `BaseEntity`,包含以下公共字段: - `id`:主键,`BIGINT`。 - `version`:乐观锁版本号,`INT`,默认值为 0。 - `create_user`:创建者 ID,`BIGINT`。 - `create_time`:创建时间,`DATETIME`。 - `update_user`:更新者 ID,`BIGINT`。 - `update_time`:更新时间,`DATETIME`。 - 公共字段通过 `@TableField` 注解指定字段名和填充策略。 ## 自动填充规范 - 使用 `CustomMetaObjectHandler` 实现自动填充。 - 插入时自动填充:`create_time`、`update_time`、`create_user`、`update_user`。 - 更新时自动填充:`update_time`、`update_user`。 - 默认创建者和更新者 ID 为 1(后续可从安全上下文中获取)。 ## 乐观锁规范 - 使用 `version` 字段实现乐观锁。 - 在实体类中使用 `@Version` 注解。 - 配置 `OptimisticLockerInnerInterceptor` 插件。 ## 枚举处理规范 - 枚举类使用 `@EnumValue` 注解标记存储值。 - 自定义 `TypeHandler` 处理枚举与数据库的映射。 - 枚举存储为 `INT` 类型,使用 code 值存储。 - 示例:`Gender` 枚举存储为 1(男)、2(女)。 ## 数据类型映射 - 遵循 MyBatis-Plus 默认映射规则。 - 字符串类型:`VARCHAR`。 - 整数类型:`INT` 或 `BIGINT`。 - 日期时间:`DATETIME`,使用 `LocalDateTime`。 - 布尔类型:根据需要映射为 `TINYINT` 或 `BIT`。 ## Mapper 规范 - Mapper 接口继承 `BaseMapper`。 - 使用 `@Mapper` 注解标记。 - 示例: ```java @Mapper public interface UserInfoMapper extends BaseMapper { } ``` ## 索引规范 - 根据查询需求添加适当索引。 - 主键自动创建索引。 - 外键字段建议添加索引。 ## 约束规范 - 根据业务需求添加必要的约束,如唯一约束、非空约束等。 - 外键约束根据需要添加,但需注意性能影响。 ## 数据迁移 - 使用 Flyway 或 Liquibase 等工具进行数据迁移(若有实现)。 - 迁移脚本命名规范:`V{version}__{description}.sql`。 ## 注意事项 - 所有规范基于现有代码实现,不得引入未实现的特性。 - 数据库设计应遵循第三范式(3NF),但可根据性能需求适当冗余。 - 定期备份数据库,确保数据安全。