数据库规格模板

用这份模板提前明确数据变更影响,降低迁移风险并提升跨团队可沟通性。它重点解决“上线可行、回滚可行、兼容可行”三个问题。

db-spec-template.md
# DB Spec 模板

## Table
- Name:
- Domain / owner:

## Columns
- id BIGINT PK
- field_name: type / nullable / default / notes

## Constraints
- PRIMARY KEY (...)
- UNIQUE (...)
- FOREIGN KEY (...)

## Indexes
- idx_xxx (col1, col2)
- expected query pattern:

## Migration Plan
- 部署步骤:
- 回填策略:
- 回滚方案:

## Compatibility
- 读写兼容窗口:
- 旧客户端影响:

## Test Checklist
- [ ] migration up/down
- [ ] 约束行为
- [ ] 索引性能
- [ ] 数据一致性校验

模板使用路径

  1. 在写 SQL 或 ORM migration 前复制迁移模板。
  2. 补齐影响行数、锁风险、兼容窗口、回滚触发条件和验证 SQL。
  3. 让数据库评审者检查查询计划和迁移顺序。
  4. 上线后记录实际耗时、锁等待和验证结果。

安全迁移规格长什么样

模板只有写入真实决策、责任人和证据后才有价值。上方空模板用于搭结构;进入实现前,建议至少写到下面这种具体程度。

Migration: add refund_retry_state
行数:1800 万

计划:
- 先增加 nullable column
- 每批回填 5000 行
- 监控锁等待和写入延迟
- 24 小时无异常读取后再加 NOT NULL

如果复制后的模板仍然缺责任人、证据或回滚字段,就先不要进入实现。

哪些场景必须写 DB Spec

迁移风险控制建议

把运维细节写在 Spec 里,通常比线上临场决策更安全。

高风险反模式

上线前检查清单

配套阅读:边界条件清单Spec 评审清单

弱迁移和强迁移对比

弱迁移

“给用户表增加 status 字段,回填数据,然后上线。”这没有说明字段是否可空、默认值、回填批次、旧代码读取行为、锁风险或失败后怎么恢复。

强迁移

“先添加可空 status,默认读取逻辑回退到旧状态字段;每批 10,000 行后台回填,监控锁等待和写入延迟;连续 24 小时无空值读取后再加 NOT NULL。”

强迁移把数据库变更拆成可观察、可暂停、可回滚的阶段。

如何接入发布流程

评审切片示例:订阅状态字段

数据库变更最适合拆成可观察阶段。下面这个切片把字段添加、读取兼容、回填和约束收紧分开,方便逐步验证。

第一阶段:
- 添加 nullable status
- 写入新订阅时同时写 billing_state 和 status
- 读取时 status 为空则回退到 billing_state

第二阶段:
- 每批回填 5,000 行
- 监控 lock wait、写入延迟和 null read 数量
- 连续 24 小时 null read 为 0 后再加 NOT NULL

回滚:
- 约束前可关闭新 writer 并保留 fallback
- 约束后不删除字段,先恢复读取 fallback

这种写法比“加字段并回填”更长,但它把生产风险拆成了能暂停、能验证、能回滚的步骤。

落地时不要漏的三件事

数据库规格最重要的不是字段表格,而是把迁移风险变成可观察、可暂停、可恢复的流程。评审结束时,团队应该知道哪一步最危险、如何暂停、谁能批准继续,以及回滚后是否需要保留新字段或补偿数据。

审批前要附上的证据

这些证据能让数据库规格贴近生产行为,而不是只停留在字段设计意图。

没有证据的迁移计划,应该被视为尚未完成评审。

什么时候应该拆分数据库规格

如果一个改动同时包含模型设计、数据回填、应用切流和旧字段清理,不要把所有内容塞进一个长段落。可以把逻辑模型、迁移步骤和验证计划拆成独立部分,让评审者先确认设计,再单独检查发布顺序是否安全。

对于不可逆变更,例如删除字段、收紧约束或清理历史数据,应在执行前写清“安全暂停点”。团队需要知道哪一步还能停下来观察,哪一步必须经过正式发布判断。

常见问题

什么时候必须写回滚方案?

只要变更会修改现有数据、影响旧版本应用、改变约束或索引,就必须写回滚或缓解方案。有些数据变更不能完全回滚,也应写清如何止损。

索引变更要写多细?

至少写预期查询、字段顺序、基数、写入影响和验证方式。对大表索引,还应说明是否需要在线 DDL、分批执行或低峰窗口。

迁移完成后如何关闭风险

数据库规格不应该在变更上线后立刻归档。完成迁移后,还应记录实际执行时间、锁等待、慢查询、回填批次、错误数量和最终验证 SQL。这样下一次类似迁移可以复用真实数据,而不是重新估算风险。

如果上线后发现查询计划、写入延迟或数据一致性与预期不同,应把差异写回规格,并标明后续动作:补索引、调整批次、延长兼容窗口,或暂停删除旧字段。

建议补充 SQL 示例、预估影响行数和锁粒度说明。最近更新:2026 年 5 月 6 日。

编辑说明

本模板涵盖 数据库规格模板,面向 Spec-First 工程团队。示例为说明性场景。

想要交互式生成规格?
填写表单,生成 Markdown——直接放进你的项目仓库。
试用规格生成器