用途:这是一份数据库设计模式的快速参考,适用于创建表、编写迁移、实现软删除等场景。
主要规则(硬性约定):数据类型使用 TEXT 而非 VARCHAR;主键使用 UUID 而非 SERIAL、BIGINT;软删除使用 deleted_at TIMESTAMP 而非 DELETE FROM;外键靠应用层校验,不用 REFERENCES 与 ON DELETE CASCADE;标准列包含 id、created_at、updated_at、deleted_at,不可省略。
模板与组件:SQL 迁移模板含表、触发器及软删除用的部分索引(partial index),完整模板见 code-templates.md。Exposed 表对象需继承 UUIDTable,使用 text() 而非 varchar(),并添加标准时间戳列。实体数据类实现 Entity<Instant>,包含全部业务字段及 createdAt、updatedAt、deletedAt。仓储模式为接口加 Default* 实现,读走 db.replica、写走 db.primary,软删除通过更新 deletedAt 实现,convert() 将 ResultRow 映射为实体。
新建表检查清单:按序列编号新建 SQL 迁移文件;在 module-repository/table/ 建表对象;在 module-repository/entity/ 建实体数据类;按需在 module-repository/constant/ 建枚举或常量;编写仓储接口与实现;编写仓储工厂 bean;编写仓储测试。
Flyway 规则:绝不在已部署序列中插入补缺的迁移;绝不重命名已部署的迁移文件;迁移编号需从最新处顺序递增;保持迁移简单专注(一个迁移一张表)。
常见坑:只有 id 列用 .value,其余列直接取值;row[Table.id].value 返回 UUID,而 row[Table.projectId] 已直接返回 UUID,给非 id 列加 .value 会编译报错。gen_random_uuid() 与 uuid_generate_v4() 每个项目只选一个,混用虽可运行但会干扰代码审查,应查看已有迁移确定项目用法。继承 SoftDeleteTable 后不要重复声明 createdAt、updatedAt、deletedAt,否则列重复报错。软删除表的索引应全部为部分索引,否则会浪费空间;软删除表若忘记 WHERE deleted_at IS NULL,完整索引会包含无人查询的死记录。存储 JSON 的文本列在 Exposed 中仍用 text(),Postgres 用 JSONB,Kotlin 用 text(),在实体层序列化与反序列化。