~/VibeHandbook
PDF grátis

Bancos de dados

postgresql.org

PostgreSQL

O que é

PostgreSQL é um banco de dados relacional maduro e de código aberto que armazena dados em tabelas tipadas, com forte suporte a (Structured Query Language, ou Linguagem de Consulta Estruturada), transações e integridade de dados. É conhecido pela correção, extensibilidade e recursos ricos como JSONB (o tipo binário do Postgres), busca de texto completo e funções de janela (window functions). É a escolha padrão para a maioria dos back-ends de aplicação que precisam de dados estruturados confiáveis.

Pontos fortes

  • Pense em uma transferência bancária que ou é totalmente concluída, ou é totalmente cancelada — nunca fica pela metade. Essa garantia de "tudo ou nada" é chamada de transações ACID (Atomicity, Consistency, Isolation, Durability — Atomicidade, Consistência, Isolamento, Durabilidade), e o Postgres oferece forte consistência por padrão.
  • SQL poderoso: joins, CTEs (Common Table Expressions, ou Expressões de Tabela Comum), funções de janela e agregações.
  • Tipos flexíveis, incluindo JSONB, arrays, ranges (intervalos) e tipos personalizados.
  • Extensões como PostGIS (geoespacial) e pgvector (embeddings).
  • Restrições fortes, chaves estrangeiras e regras de verificação garantem a qualidade dos dados.

Contrapartidas

  • O escalonamento vertical é fácil; o sharding horizontal exige ferramentas adicionais.
  • Exige migrações de esquema conforme seu modelo evolui.
  • Mais pesado de operar do que um banco de dados de arquivo único para projetos pequenos.
  • O modelo de conexão por cliente exige um pooler (agrupador de conexões, como o PgBouncer) em alta escala.

Quando usar

Recorra ao PostgreSQL como sua escolha padrão para praticamente qualquer aplicação com dados relacionais, transações ou necessidades de relatórios: back-ends de SaaS (Software as a Service, ou Software como Serviço), e-commerce, análises de dados e qualquer coisa que se beneficie de restrições e joins.

Encaixe no vibe coding

Ao orientar a IA, forneça a ela as entidades e seus relacionamentos, depois peça que produza um esquema normalizado com chaves primárias, chaves estrangeiras, restrições NOT NULL e índices sensatos. Insista em consultas parametrizadas (nunca SQL concatenado como string) para evitar injeção de código, e peça à IA que envolva escritas de múltiplas etapas em uma transação. Uma boa dica: peça à IA para também gerar um arquivo de migração reversível. Peça que ela explique cada índice que adiciona, também. Assim você entende as contrapartidas entre leitura e escrita antes de aplicá-las.

CREATE TABLE users (
  id         BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  email      TEXT NOT NULL UNIQUE,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE orders (
  id       BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  user_id  BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  total    NUMERIC(10,2) NOT NULL CHECK (total >= 0),
  status   TEXT NOT NULL DEFAULT 'pending'
);

CREATE INDEX idx_orders_user_id ON orders(user_id);

-- Parameterized query (placeholders, not concatenation)
SELECT o.id, o.total
FROM orders o
WHERE o.user_id = $1 AND o.status = $2;