第12章学习笔记:数据库工程项目:从需求到上线
课程笔记以一套可运行的小型订单系统贯穿需求、设计、迁移、测试、观测和复盘。
关联:章节 第12章 数据库工程项目:从需求到上线
第12章笔记:数据库工程项目:从需求到上线
本章不是七个并列名词
以一套可运行的小型订单系统贯穿需求、设计、迁移、测试、观测和复盘。 学习顺序从《需求、用例与数据不变量》开始,到《答辩、复盘与下一步演进》闭合。每一节都要留下下一节能直接使用的对象:模式、关系、查询结果、页、计划、事务状态、日志记录或部署证据。若你只能逐条背定义,却说不清前一节输出怎样成为后一节输入,这一章还没有真正连起来。
七节依赖与例题
1. 需求、用例与数据不变量
要解决的问题: 先列参与者、命令、查询、并发冲突和合规要求,再把不可破坏的事实写成可测试不变量。
跟着做: 订单项目规定库存不得为负、支付幂等、订单总额等于明细快照之和、用户只能看自己的订单。
验收规则: 每条不变量都要对应数据库约束、事务算法或监控,不能停在需求文档口号。
2. 逻辑模式与迁移计划
要解决的问题: 从 ER 与依赖得到逻辑模式后,还要给版本迁移、回填、双读写边界和回滚;生产变更不能假设停机重建。
跟着做: 把 order.status 拆成状态历史表:先建新表、回填、双写校验、切读、停止旧写,最后延迟删除旧列。
验收规则: 迁移每一步应向前兼容当前与相邻版本,并有行数、校验和及回滚点。
3. 查询契约与索引预算
要解决的问题: 为每个 API 写输入、输出粒度、排序、最大结果量和延迟目标,再按代表性数据设计少量索引。
跟着做: 订单列表按 tenant、created_at 游标分页,详情按 order_id 聚合;分别验证复合索引与主键访问。
验收规则: 索引预算同时记录读收益、写放大、空间、构建时间和弃用条件。
4. 事务边界与幂等接口
要解决的问题: 事务应围绕一个业务不变量闭合,外部调用通常不能长时间占着数据库锁;幂等键让重试不重复产生效果。
跟着做: 创建支付先以 request_id 唯一约束登记意图,提交后异步调用支付方,再用状态机处理回调。
验收规则: 幂等 = 稳定请求身份 + 唯一约束 + 可重放结果;超时不等于失败。
5. 测试金字塔与故障注入
要解决的问题: 除普通样例外还要测约束反例、并发历史、迁移兼容、性能分布和恢复;测试库规模过小会掩盖计划问题。
跟着做: 用两个连接同时抢库存验证只一人成功,杀进程后重启核对已提交订单,制造重复回调检验幂等。
验收规则: 测试覆盖正常路径、边界、非法状态、竞争、故障与恢复,并保存可重复脚本。
6. 观测、容量与上线门禁
要解决的问题: 数据库观测包含吞吐、尾延迟、慢查询、锁等待、缓冲命中、复制延迟、磁盘与连接池;平均值会隐藏尖峰。
跟着做: 上线前用预期峰值两倍压测,检查 p95/p99、锁等待和 I/O;设容量水位与回滚阈值。
验收规则: Little 定律用于核对并发,SLO 用百分位与错误预算定义,而不是只看平均响应。
7. 答辩、复盘与下一步演进
要解决的问题: 项目答辩要展示决策依据、失败实验、权衡和证据;演进从已观测瓶颈出发,不为炫技提前分布式化。
跟着做: 提交模式图、迁移脚本、查询计划、并发测试、恢复记录和监控面板,现场解释一个没采用的方案。
验收规则: 完成标准是另一位工程师能从空环境复现、验证关键不变量并按手册恢复。
章内共同推理方法
先写“一行或一个状态代表什么”,再写它必须满足的键、约束、顺序或故障假设。遇到 SQL,先定结果粒度和重复/NULL 语义,再编码;遇到存储与优化,先估算页数、基数和 I/O,再看真实执行计划;遇到事务与分布式,先画时间线和允许历史,再讨论隔离级别、日志或共识。任何公式都要带单位、数据分布和适用边界。
可复现练习
从本章七个例题中任选两个,用 SQLite 或课程给定模型从空环境重做。保存建表/输入、执行步骤、实际输出和断言;随后故意加入一个重复键、NULL、并发交错、崩溃点、倾斜分布或网络分区,记录第一个被破坏的不变量。只截成功界面、只贴 SQL 或只报告耗时不算完成。
闭卷验收
用十分钟画出本章七节箭头图;任选一条箭头解释传递的具体字段、状态或证据。再为《答辩、复盘与下一步演进》写一个最小失败案例,并追溯它需要《需求、用例与数据不变量》中的哪条定义才能修复。最后列出三道题:一道唯一答案判断、一道多条件选择、一道必须计算或写 SQL/状态轨迹的问题,且每题都写清为什么其他答案错。