// aula 02 · PostgreSQL · Arquitetura
Que tipo de banco de dados é o PostgreSQL?
O PostgreSQL é classificado como um ORDBMS (Object-Relational Database Management System) — ou seja, é um banco relacional com extensões de orientação a objetos. Isso significa que ele organiza os dados em tabelas com linhas e colunas (como todo banco relacional), mas também suporta tipos customizados, herança de tabelas, funções em múltiplas linguagens e muito mais.
Dados organizados em tabelas com relacionamentos via chaves primárias e estrangeiras. Suporte completo ao padrão SQL:2016.
Crie seus próprios tipos de dados, use herança entre tabelas e defina operadores customizados — conceitos vindos da POO.
Arquitetura — como uma query é processada
Ao contrário do MySQL (que usa threads), o PostgreSQL cria um processo OS separado para cada conexão. Isso dá isolamento e estabilidade — uma conexão travada não afeta as outras — mas tem custo de memória. Por isso, usar um connection pooler como o PgBouncer é uma prática essencial em produção.
ACID — a garantia das transações
Uma transação é atômica: ou todas as operações são confirmadas com COMMIT, ou nenhuma é — com ROLLBACK. Não existe estado intermediário.
As constraints (NOT NULL, UNIQUE, FK, CHECK) garantem que o banco nunca fique em um estado inválido após uma transação.
O PostgreSQL usa MVCC (Multi-Version Concurrency Control) para que leituras e escritas não se bloqueiem mutuamente. Cada transação vê um snapshot consistente.
Uma vez confirmado, o dado nunca se perde — mesmo em caso de queda de energia. O WAL (Write-Ahead Log) garante isso.
-- Exemplo de transação ACID no PostgreSQL BEGIN; UPDATE contas SET saldo = saldo - 500 WHERE id = 1; -- debita da conta origem UPDATE contas SET saldo = saldo + 500 WHERE id = 2; -- credita na conta destino -- Se algo falhar antes do COMMIT → ROLLBACK automático COMMIT; -- confirma ambas as operações juntas
Tipos de dados exclusivos do PostgreSQL
-- Tipos que o PostgreSQL tem e outros bancos não têm -- JSON e JSONB (binário, indexável) SELECT dados->'nome' FROM usuarios WHERE dados @> '{"ativo": true}'; -- Arrays nativos SELECT * FROM produtos WHERE 3 = ANY(categorias); -- Intervalo de valores (RANGE) SELECT * FROM eventos WHERE periodo && '[2024-01-01, 2024-12-31]'::daterange; -- UUID nativo CREATE TABLE usuarios ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, nome TEXT NOT NULL ); -- Tipos geométricos (ponto, linha, polígono) SELECT * FROM locais WHERE posicao<-> '(0,0)' < 10; -- distância euclidiana
Armazene documentos JSON diretamente no banco, com suporte a índices GIN para buscas rápidas dentro do JSON.
Uma coluna pode guardar uma lista de valores do mesmo tipo — sem precisar de uma tabela auxiliar para casos simples.
Represente intervalos de datas, números ou timestamps com operadores nativos de sobreposição e contenção.
PostgreSQL vs outros bancos
| Recurso | PostgreSQL | MySQL | SQL Server |
|---|---|---|---|
| Licença | Open Source (livre) | GPL / Proprietária | Proprietária |
| ACID completo | ✓ sim | ✓ sim | ✓ sim |
| JSONB nativo | ✓ sim | ✗ não | ✗ não |
| Arrays nativos | ✓ sim | ✗ não | ✗ não |
| Tipos customizados | ✓ sim | ✗ limitado | ✗ limitado |
| Extensões | ✓ sim (PostGIS, pgvector…) | ✗ limitado | ✗ limitado |
| Full-text search | ✓ sim | ✓ sim | ✓ sim |
| Window functions | ✓ avançado | ✓ básico | ✓ sim |
Extensões famosas
Transforma o PostgreSQL em um banco de dados geográfico completo. Usado em mapas, GIS, localização e análise territorial.
Armazena e busca embeddings de machine learning diretamente no banco. Muito usado em sistemas de IA generativa e RAG.
Extensão para dados de séries temporais (IoT, métricas, logs). Adiciona compressão automática e queries otimizadas por tempo.
Agende queries SQL para rodar automaticamente no banco, como um cron do Linux — sem precisar de scripts externos.