specsfy-specialist-postgres
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePostgreSQL
PostgreSQL
Quando usar
适用场景
- Acionar para desenhar schema, escrever ou revisar SQL, escolher índice,
analisar plano (), diagnosticar lock/deadlock, planejar migration ou dimensionar backup/restore em Postgres.
EXPLAIN - Acionar também quando um ORM (Eloquent, Prisma, Drizzle) gerar SQL ineficiente e a causa raiz for modelagem ou índice, não a API do ORM.
- Não acionar para decisões específicas de Supabase (RLS, Auth, Realtime,
Edge Functions) — usar , que aplica Postgres por baixo com essas camadas adicionais.
$specsfy-specialist-supabase - Combinar com quando o ponto de entrada for Eloquent e com
$specsfy-specialist-laravelquando o gargalo abranger além do banco (aplicação, rede, cache).$specsfy-specialist-performance-engineering
- 适用于Postgres中的Schema设计、SQL编写或审核、索引选择、执行计划分析()、锁/死锁诊断、迁移规划或备份/恢复容量规划场景。
EXPLAIN - 当ORM(Eloquent、Prisma、Drizzle)生成低效SQL,且根源在于数据建模或索引问题而非ORM API时,也可启用此技能。
- 请勿用于Supabase的特定功能决策(RLS、Auth、Realtime、Edge Functions)——请使用,该技能会在这些附加层之下应用Postgres相关能力。
$specsfy-specialist-supabase - 当入口为Eloquent时,可结合使用;当性能瓶颈超出数据库范围(应用、网络、缓存)时,可结合
$specsfy-specialist-laravel使用。$specsfy-specialist-performance-engineering
Fluxo
流程
- Descobrir versão do Postgres, extensões instaladas, volume atual, crescimento esperado, workload (OLTP, analítico, misto) e quem é o owner dos dados antes de recomendar.
- Modelar invariantes com tipos precisos, ,
NOT NULL,CHECK, chaves estrangeiras e normalização adequada ao caso de uso.UNIQUE - Escrever a consulta mais simples que expressa a regra e medir o plano
real com sobre dados representativos, nunca sobre uma tabela vazia ou de desenvolvimento.
EXPLAIN (ANALYZE, BUFFERS) - Selecionar índice pelo workload observado (predicados do ,
WHERE,ORDER BY) — nunca por "essa coluna é consultada" isoladamente.JOIN - Analisar isolation level, duração de transação, ordem de aquisição de locks e concorrência esperada sob a carga real.
- Planejar a migration com compatibilidade entre a versão antiga e nova da aplicação durante o deploy, e um caminho de rollback testável.
- Validar backup, restore, monitoramento e capacidade no ambiente alvo antes de declarar a mudança pronta para produção.
- 在给出建议前,先了解Postgres版本、已安装扩展、当前数据量、预期增长、工作负载(OLTP、分析型、混合型)以及数据所有者信息。
- 使用精准数据类型、、
NOT NULL、CHECK、外键和适配业务场景的规范化设计来定义数据约束。UNIQUE - 编写最简洁的查询语句表达业务规则,并在具有代表性的真实数据上使用分析实际执行计划,切勿在空表或开发环境表上测试。
EXPLAIN (ANALYZE, BUFFERS) - 根据实际观测到的工作负载(条件、
WHERE、ORDER BY关联)选择索引——切勿仅凭“该列被查询”就单独创建索引。JOIN - 分析隔离级别、事务时长、锁获取顺序以及真实负载下的预期并发情况。
- 规划迁移方案,确保部署期间新旧版本应用的兼容性,并设计可测试的回滚路径。
- 在宣布变更可用于生产环境前,验证目标环境中的备份、恢复、监控能力。
Padrões
最佳实践
- Preferir constraint do banco (,
NOT NULL,CHECK, FK,UNIQUE) para toda invariante que sempre deve valer — validação só na aplicação permite dado inconsistente por qualquer segundo caminho de escrita.EXCLUDE - Evitar em código de produção, tipos imprecisos (
SELECT *para enum fechado,textpara dinheiro) e índice redundante que duplica outro já existente com prefixo igual.float - Nunca adicionar índice sem ler padrão de escrita, tamanho da tabela, seletividade do predicado e o plano antes/depois — índice mal escolhido piora escrita sem acelerar leitura.
- Manter transação curta (evitar I/O externo, espera de usuário ou chamada de rede dentro dela) e ordem de aquisição de locks consistente entre todos os caminhos de código para evitar deadlock.
- Rodar somente em ambiente onde executar a consulta de verdade é seguro (não em produção sem
EXPLAIN (ANALYZE, BUFFERS)/replica).ROLLBACK - Aplicar expand/contract em mudança de schema incompatível ou em tabela de alto volume: nunca renomear/remover coluna lida em produção no mesmo passo que a adiciona.
- Conceder o menor privilégio necessário e separar papéis de migration
(DDL), aplicação (DML) e leitura (apenas) — a aplicação nunca conecta com um role que pode
SELECT.DROP TABLE
- 对于所有必须始终生效的数据约束,优先使用数据库层面的约束(、
NOT NULL、CHECK、外键、UNIQUE)——仅在应用层做验证会导致其他写入路径产生不一致数据。EXCLUDE - 生产代码中避免使用、不精准的数据类型(用
SELECT *存储固定枚举值、用text存储金额)以及与现有索引前缀重复的冗余索引。float - 创建索引前,务必了解写入模式、表大小、条件选择性以及创建前后的执行计划——选择不当的索引会降低写入性能却无法加速读取。
- 保持事务简短(避免在事务中执行外部I/O、等待用户输入或调用网络接口),并确保所有代码路径的锁获取顺序一致,以避免死锁。
- 仅在可安全执行查询的环境中运行(无
EXPLAIN (ANALYZE, BUFFERS)或非副本的生产环境请勿执行)。ROLLBACK - 对不兼容的Schema变更或高流量表采用扩展/收缩策略:切勿在添加列的同时重命名/删除生产环境中正在被读取的列。
- 遵循最小权限原则,区分迁移(DDL)、应用(DML)和只读(仅)角色——应用程序绝不能使用拥有
SELECT权限的角色连接数据库。DROP TABLE
Antipadrões
反模式
- Índice criado por "essa coluna aparece no WHERE", ignorando seletividade — em coluna de baixa cardinalidade (booleano, status com poucos valores) o planner frequentemente prefere seq scan e o índice só custa em escrita.
- em versão antiga do Postgres (< 11) reescrevendo a tabela inteira sob lock — em versões atuais isso é otimizado para
ALTER TABLE ... ADD COLUMN ... NOT NULL DEFAULTconstante, masDEFAULTcom função volátil ainda reescreve.DEFAULT - Transação longa mantendo lock enquanto espera resposta de rede ou confirmação do usuário — bloqueia autovacuum de limpar tuplas mortas e aumenta bloat.
- Paginação por grande em tabela que cresce — custo cresce linearmente com o offset; preferir paginação por keyset (
OFFSET).WHERE id > :cursor ORDER BY id LIMIT :n - Backup automatizado nunca restaurado — "temos backup" sem um restore completo testado é uma suposição não verificada, não uma garantia.
- 仅凭“该列出现在WHERE条件中”就创建索引,忽略选择性——对于低基数列(布尔值、状态值较少的字段),查询优化器通常会选择全表扫描,此类索引只会增加写入开销。
- 在旧版本Postgres(<11)中执行会在锁表状态下重写整个表——当前版本已对常量
ALTER TABLE ... ADD COLUMN ... NOT NULL DEFAULT做了优化,但使用易变函数的DEFAULT仍会触发全表重写。DEFAULT - 长时间持有锁的事务等待网络响应或用户确认——会阻碍autovacuum清理死元组,导致数据膨胀。
- 在持续增长的表中使用大进行分页——开销随偏移量线性增长;优先使用键集分页(
OFFSET)。WHERE id > :cursor ORDER BY id LIMIT :n - 仅自动备份却从不恢复测试——“我们有备份”但未完成完整恢复测试只是未验证的假设,而非保障。
Validação
验证
- Testar integridade (constraints violadas geram erro esperado), concorrência (dois writers simultâneos não corrompem invariante) e as queries críticas do caminho quente.
- Comparar antes/depois com cardinalidade realista, não com a tabela vazia do ambiente de desenvolvimento.
EXPLAIN (ANALYZE, BUFFERS) - Estimar o lock e o tempo de rewrite de qualquer DDL contra o tamanho real da tabela em produção antes de agendar a janela de deploy.
- Provar restore periodicamente a partir do backup real, incluindo o tempo que o processo leva (RTO) — backup sem restore testado não é uma garantia de recuperação.
- Não declarar uma mudança "sem impacto de performance" sem o plano comparado; não declarar um schema "íntegro" sem os testes de constraint e concorrência acima.
- 测试数据完整性(违反约束时触发预期错误)、并发处理(两个写入端同时操作不会破坏数据约束)以及核心路径的关键查询。
- 使用真实基数数据对比变更前后的结果,切勿用开发环境的空表测试。
EXPLAIN (ANALYZE, BUFFERS) - 在安排部署窗口前,估算任何DDL操作在生产环境真实表大小下的锁时长和重写时间。
- 定期从真实备份中执行恢复测试,包括记录恢复耗时(RTO)——未经过恢复测试的备份无法保证数据可恢复。
- 未对比执行计划前,切勿宣称变更“无性能影响”;未完成上述约束与并发测试前,切勿宣称Schema“完整可靠”。
Skills relacionadas
相关技能
- define ameaça, autorização e isolamento que constraints, roles e RLS materializam no banco.
$specsfy-specialist-application-security - quando o Postgres for gerenciado por Supabase (RLS, Auth, Realtime, pooling específico).
$specsfy-specialist-supabase - quando o ponto de entrada for Eloquent e a correção precisar refletir em migration/model.
$specsfy-specialist-laravel - quando o gargalo não se resolver só com índice/plano (rede, cache, aplicação).
$specsfy-specialist-performance-engineering - para métricas e alertas de banco em produção (conexões, locks, replicação, lag).
$specsfy-specialist-observability - quando parte do estado consultado estiver em cache fora do banco — o Postgres continua sendo a fonte de verdade que o Redis nunca substitui.
$specsfy-specialist-redis - para empacotar e operar o servidor Postgres em container (imagem oficial, volume de dados, healthcheck) — decisão de schema, índice e plano continuam aqui.
$specsfy-specialist-docker
Leia references/standards.md para tipos, índices,
concorrência, segurança, migrations, operação e fontes oficiais.
- 定义了数据库中约束、角色和RLS所实现的威胁防护、授权与隔离机制。
$specsfy-specialist-application-security - 当Postgres由Supabase托管时(RLS、Auth、Realtime、特定连接池),使用。
$specsfy-specialist-supabase - 当入口为Eloquent且需要在迁移/模型中体现修正时,使用。
$specsfy-specialist-laravel - 当性能瓶颈无法仅通过索引/执行计划解决时(涉及网络、缓存、应用层),使用。
$specsfy-specialist-performance-engineering - 用于生产环境数据库的指标与告警(连接数、锁、复制、延迟)。
$specsfy-specialist-observability - 当部分查询状态存储在数据库外的缓存中时,使用——Postgres始终是唯一可信数据源,Redis无法替代。
$specsfy-specialist-redis - 用于容器化打包与运维Postgres服务器(官方镜像、数据卷、健康检查)——Schema设计、索引选择与执行计划仍由本技能覆盖。
$specsfy-specialist-docker
阅读references/standards.md了解数据类型、索引、并发、安全、迁移、运维相关内容及官方资料。