Melhores Práticas para Bancos de Dados
Regras para evolução confiável de esquemas, dimensionamento de pools e SQL seguro em serviços Rust.
Como Usar Esta Lista
- Aplique no design do esquema, revisão de consultas e postmortems de incidentes.
- Automatize execuções de migração e
cargo sqlx prepareem CI. - Perfure SQL antes de culpar o framework web pela latência.
A - Esquema e Migrações
- Toda alteração de esquema é um arquivo de migração forward. Nunca edite migrações aplicadas.
- Alterações aditivas primeiro. Colunas anuláveis, preenchimento, depois restrições.
- Indexe chaves estrangeiras e filtros frequentes. EXPLAIN consultas lentas em staging.
- Uma ferramenta de migração por repositório. Migrações sqlx OU Diesel OU SeaORM - não as três.
- Execute migrações no pipeline de deploy antes da mudança de tráfego.
B - Conexões e Pools
- Um pool por processo em
AppState. Nunca por requisição. - Dimensionar pool de
instâncias × max_connections ≤ limite do DB. Deixe 20-30% de margem. - Definir
acquire_timeout. Falhar rapidamente com 503 em vez de travar. - Fechar pool no desligamento gracioso. Drenar consultas em andamento.
- Usar PgBouncer quando muitos serviços pequenos compartilham PostgreSQL.
C - Consultas e Transações
- Apenas consultas parametrizadas. Não use format! para valores SQL.
- Eliminar N+1. JOIN ou
ANY($1)para carregar em lote. - Manter transações curtas. Sem HTTP externo dentro de
begin/commit. - Paginar listas grandes. Paginação por chave de cursor sobre OFFSET para tabelas grandes.
- Mapear linhas para DTOs na fronteira da API. Ocultar colunas internas.
D - Cache e Redis
- SQL é a fonte da verdade para dados duráveis. Redis para cache e estado efêmero.
- TTL em cada chave de cache. Prevenir crescimento ilimitado.
- Estratégia de invalidação de cache documentada. Chaves de versão ou pub/sub.
- Monitorar taxa de acertos e memória. Alertar sobre tempestades de evicção.
- Não armazenar segredos no Redis sem criptografia em repouso.
E - Operações e Segurança
- Papéis de DB separados para app vs migrações vs admin. Privilégio mínimo.
- Rotacionar credenciais via gerenciador de segredos. Não envs simples em repositórios.
- Registrar consultas lentas com ID de requisição. Redigir valores de parâmetros com PII.
- Backup e teste de restauração trimestralmente. Migrações não são backups.
-
SELECT 1apenas em/ready. Distinguir liveness de dependência de DB.
FAQs
sqlx ou ORM?
sqlx é o padrão para serviços async; ORM quando as relações dominam e a equipe prefere construtores.
Maior erro de DB?
Pools superdimensionados esgotando conexões do PostgreSQL sob carga.
SQLite em produção?
Aceitável para edge/single-tenant; PostgreSQL para SaaS multi-tenant.
Quando usar SQL puro?
Relatórios, ingestão em massa e caminhos críticos de performance - manter no módulo do repositório.
Banco de dados de teste?
testcontainers ou #[sqlx::test] com DB descartável.
Réplicas de leitura?
Pools separados; tolerar lag de replicação em dashboards.
String de conexão em logs?
Nunca - redigir senhas em assinantes de tracing.
Deadlocks?
Tentar novamente transações; manter a ordem de bloqueio consistente entre os caminhos de código.
Migração de ORM do Rails?
Portar o esquema via migrações SQL; reescrever consultas incrementalmente.
Observabilidade?
Tempo de aquisição do pool, histogramas de duração de consulta, gauge de conexões ativas.
Relacionados
- Noções Básicas de Bancos de Dados - Primeiros passos
- sqlx - Driver principal
- Migrações - Fluxo de trabalho de esquema
- Pooling de Conexão - Dimensionamento
- Melhores Práticas para Backends Web - Camada HTTP
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.