// aula 02 · PostgreSQL · Arquitetura

Como o PostgreSQL
funciona por dentro


Que tipo de banco de dados é o PostgreSQL?

Relacional + Orientado a Objetos (ORDBMS)

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.

Relacional

Tabelas, linhas e SQL

Dados organizados em tabelas com relacionamentos via chaves primárias e estrangeiras. Suporte completo ao padrão SQL:2016.

Orientado a Objetos

Tipos e herança

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

① Cliente envia a query
Cliente
(psql / app)
Postmaster
(processo pai)
Backend Process
(por conexão)
② Query é analisada, planejada e executada
Parser
(SQL → AST)
Rewriter
(regras / views)
Planner / Optimizer
Executor
③ Dados lidos/escritos no disco com cache
Shared Buffer
(cache em RAM)
WAL
(log de transações)
Disco
(arquivos .dat)

Processo por conexão (process-per-connection)

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

A — Atomicity

Tudo ou nada

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.

C — Consistency

Estado sempre válido

As constraints (NOT NULL, UNIQUE, FK, CHECK) garantem que o banco nunca fique em um estado inválido após uma transação.

I — Isolation

Transações independentes

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.

D — Durability

Dados persistidos

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
JSONB

JSON binário

Armazene documentos JSON diretamente no banco, com suporte a índices GIN para buscas rápidas dentro do JSON.

ARRAY

Arrays nativos

Uma coluna pode guardar uma lista de valores do mesmo tipo — sem precisar de uma tabela auxiliar para casos simples.

RANGE

Intervalos

Represente intervalos de datas, números ou timestamps com operadores nativos de sobreposição e contenção.


PostgreSQL vs outros bancos

RecursoPostgreSQLMySQLSQL Server
LicençaOpen Source (livre)GPL / ProprietáriaProprietá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

PostGIS

Dados geoespaciais

Transforma o PostgreSQL em um banco de dados geográfico completo. Usado em mapas, GIS, localização e análise territorial.

pgvector

Busca por similaridade (IA)

Armazena e busca embeddings de machine learning diretamente no banco. Muito usado em sistemas de IA generativa e RAG.

TimescaleDB

Séries temporais

Extensão para dados de séries temporais (IoT, métricas, logs). Adiciona compressão automática e queries otimizadas por tempo.

pg_cron

Jobs agendados

Agende queries SQL para rodar automaticamente no banco, como um cron do Linux — sem precisar de scripts externos.