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;