用途
该技能用于 PostgreSQL 的建模、查询、迁移与运维,强调完整性、索引、并发、安全、性能与恢复。触发场景包括:设计 schema、编写或审查 SQL、选择索引、分析执行计划(EXPLAIN)、诊断锁与死锁、规划 migration、评估备份与恢复规模。
当 ORM(Eloquent、Prisma、Drizzle)生成低效 SQL,且根因在于建模或索引而非 ORM API 时,也应触发本技能。
不适用于 Supabase 特有决策(RLS、Auth、Realtime、Edge Functions),此类场景应使用 $specsfy-specialist-supabase。当入口为 Eloquent 时可与 $specsfy-specialist-laravel 组合;当瓶颈超出数据库范围(应用、网络、缓存)时可与 $specsfy-specialist-performance-engineering 组合。
工作流程
- 在给出建议前,先了解 PostgreSQL 版本、已安装扩展、当前数据量、预期增长、工作负载类型(OLTP、分析型或混合)以及数据 owner。
- 用精确类型、NOT NULL、CHECK、UNIQUE、外键以及适合用例的规范化来建模不变量。
- 编写能表达规则的最简查询,并在有代表性的数据上用 EXPLAIN (ANALYZE, BUFFERS) 测量真实计划,绝不在空表或开发表上测量。
- 依据观测到的工作负载(WHERE 谓词、ORDER BY、JOIN)选择索引,而不是仅凭“该列被查询过”。
- 分析隔离级别、事务时长、锁获取顺序以及真实负载下的预期并发。
- 规划 migration 时保证部署期间新旧应用版本兼容,并具备可测试的回滚路径。
- 将执行标记为 [MIGRATION],指明版本化文件,在测试库应用并查询迁移器历史后再结束。
- 在宣布变更可上生产前,验证目标环境的备份、恢复、监控与容量。
标准做法
- 对始终应成立的不变量优先使用数据库约束(NOT NULL、CHECK、UNIQUE、FK、EXCLUDE);仅在应用层校验会让任何第二条写入路径产生不一致数据。
- 生产代码避免 SELECT *、不精确类型(用 text 表示封闭枚举、用 float 表示金额)以及与其他已有索引前缀相同的冗余索引。
- 在未阅读写入模式、表大小、谓词选择性和前后计划前,绝不添加索引;选择不当的索引会拖慢写入且不加速读取。
- 保持事务短小(避免在事务内做外部 I/O、等待用户或网络调用),并在所有代码路径中保持一致的锁获取顺序以避免死锁。
- 仅在真正执行查询安全的环境运行 EXPLAIN (ANALYZE, BUFFERS)(不在无 ROLLBACK/副本的生产环境运行)。
- 对不兼容的 schema 变更或高流量表采用 expand/contract:绝不在添加列的同一步骤中重命名或删除生产环境正在读取的列。
- 授予最小必要权限,分离 migration(DDL)、应用(DML)和只读(仅 SELECT)角色;应用绝不用可 DROP TABLE 的角色连接。
反模式
- 仅因“该列出现在 WHERE 中”就创建索引而忽略选择性——在低基数(布尔、取值很少的状态)列上,planner 常偏好 seq scan,索引只增加写入成本。
- 在旧版 PostgreSQL(< 11)执行 ALTER TABLE ... ADD COLUMN ... NOT NULL DEFAULT 会整表重写并持锁;新版本对常量 DEFAULT 有优化,但使用易变函数的 DEFAULT 仍会重写。
- 长事务在等待网络响应或用户确认时持锁——阻碍 autovacuum 清理死元组并增加膨胀。
- 在持续增长的表上使用大 OFFSET 分页——成本随 offset 线性增长;应优先 keyset 分页(WHERE id > :cursor ORDER BY id LIMIT :n)。
- 自动化备份从未恢复过——“我们有备份”若未经完整恢复测试,只是未经验证的假设,而非保证。
验证
- 测试完整性(违反约束产生预期错误)、并发(两个同时写入者不破坏不变量)以及热路径关键查询。
- 用真实基数比较前后 EXPLAIN (ANALYZE, BUFFERS),而非开发环境的空表。
- 在安排部署窗口前,针对生产表真实大小估算任何 DDL 的锁与重写时间。
- 通过文件、应用命令和迁移器历史查询核对每个 [MIGRATION] 任务,均记录为零输出。
- 定期从真实备份证明恢复,包括过程耗时(RTO)——未经恢复测试的备份不构成恢复保证。
- 没有对比计划,不得宣称变更“无性能影响”;没有上述约束与并发测试,不得宣称 schema“完整”。
相关技能
- $specsfy-specialist-data-modeling:在 PostgreSQL 细节之前处理实体、关系与生命周期。
- $specsfy-specialist-application-security:定义威胁、授权与隔离,由约束、角色和 RLS 在数据库落地。
- $specsfy-specialist-supabase:当 PostgreSQL 由 Supabase 管理时(RLS、Auth、Realtime、特定连接池)。
- $specsfy-specialist-laravel:当入口为 Eloquent 且修复需反映到 migration/model。
- $specsfy-specialist-performance-engineering:当瓶颈无法仅靠索引/计划解决(网络、缓存、应用)。
- $specsfy-specialist-observability:生产数据库指标与告警(连接、锁、复制、延迟)。
- $specsfy-specialist-redis:当部分被查询状态位于数据库外缓存——PostgreSQL 仍是 Redis 无法替代的事实来源。
- $specsfy-specialist-docker:在容器中打包与运行 PostgreSQL 服务器(官方镜像、数据卷、healthcheck)——schema、索引与计划决策仍属本技能。
更多内容参见 references/standards.md,涵盖类型、索引、并发、安全、迁移、运维与官方来源。