Pular para o conteúdo principal

Banco de Dados

Para quem é esta página

Engenheiros back-end e DBAs. Para a decisão de escolher PostgreSQL, veja ADR-002.

Stack

ExtensãoUso
PostGIS 3.4Geometrias de imóveis rurais (SRID 4674 — SIRGAS 2000)
pgvectorEmbeddings do RAG (1536 dimensões — OpenAI text-embedding-3-small)
pgcryptoCriptografia de CPF e e-mail em repouso (conformidade LGPD)
uuid-osspGeração de UUIDs no banco (gen_random_uuid())

Principais Tabelas

TabelaDescrição
usersUsuários — CPF e e-mail criptografados com pgcrypto
imoveis_ruraisImóveis com geometria GEOMETRY(MULTIPOLYGON, 4674)
processos_carCiclo de vida do processo — índice por status + prioridade
documentosMetadados dos arquivos + resultado do OCR em JSONB
pendenciasPendências por processo
historico_processosAuditoria imutável — particionado por mês
canal_vinculosVinculação de canal de mensageria (futuro/opcional) — identificador como hash SHA-256
knowledge_baseChunks de documentos normativos + embedding (pgvector)
outboxFila de eventos de domínio a publicar no RabbitMQ
audit_logsAudit log genérico — particionado por mês

Princípios do Modelo

  • UUIDs como PKs — gerados pelo banco (gen_random_uuid())
  • Soft deletedeleted_at TIMESTAMPTZ nullable em tabelas de negócio
  • Auditoria universalcreated_at + updated_at em todas as tabelas
  • Tabelas imutáveishistorico_processos e audit_logs só aceitam INSERT
  • Particionamentohistorico_processos e audit_logs particionados por RANGE(created_at) mensal

Consultas Geoespaciais

-- Processos cujo imóvel intersecta uma área de alerta
SELECT p.id, p.numero_car
FROM processos_car p
JOIN imoveis_rurais ir ON ir.id = p.imovel_id
WHERE ST_Intersects(
ir.geometria,
ST_GeomFromText('POLYGON((-44.0 -5.0, ...))', 4674)
);

-- Índice GiST obrigatório para performance
CREATE INDEX idx_imoveis_geometria ON imoveis_rurais USING GIST(geometria);

Busca Semântica (pgvector)

-- Buscar chunks mais similares à query do usuário
SELECT conteudo, fonte, 1 - (embedding <=> $1) AS similaridade
FROM knowledge_base
ORDER BY embedding <=> $1
LIMIT 5;

-- Índice IVFFlat para performance
CREATE INDEX idx_kb_embedding ON knowledge_base
USING ivfflat(embedding vector_cosine_ops) WITH (lists = 100);
SRID 4674 — SIRGAS 2000

Sempre use SRID 4674 para dados geoespaciais brasileiros. É o padrão oficial do IBGE, SICAR e SIGEF. Usar SRID 4326 (WGS84) causa pequenas divergências nas medições de área.

Ver também