Tipos de Paginação | Arquitetura
- Tipos de Paginação | Arquitetura
Vídeo explicativo sobre cursor e offset: Wilson Neto - Youtube
1. Paginação por Página (Page-based Pagination)
-
Como funciona: O cliente (front-end) informa o número da página que deseja, e o servidor retorna aquele “lote” de registros. Exemplo:
/items?page=2&limit=20→ retorna os itens da página 2, com 20 itens por página. -
Vantagens:
- Fácil de implementar e entender.
- Boa para casos simples (listas pequenas ou médias).
-
Desvantagens:
- Pouco eficiente em bases muito grandes (pois o servidor precisa calcular saltos grandes).
- Problemas se os dados mudarem entre uma consulta e outra (inconsistência).
2. Paginação por Offset (Offset-based Pagination)
-
Como funciona: O cliente informa quantos registros deve pular (offset) e quantos deve pegar (limit). Exemplo:
/items?offset=40&limit=20→ pula 40 registros e retorna os próximos 20. -
Vantagens:
- Flexível (permite pular para qualquer ponto da lista).
- Simples de implementar em SQL (usa
OFFSETeLIMIT).
-
Desvantagens:
- Custo cresce com offsets altos (o banco precisa percorrer todos os registros até chegar no ponto).
- Também sofre com inconsistência se os dados mudarem (itens podem “pular” ou se repetir).
3. Paginação por Cursor (Cursor-based Pagination)
-
Como funciona: Em vez de usar números de página ou offset, o servidor devolve um marcador (cursor) que aponta para a posição do último item retornado. O cliente usa esse cursor na próxima requisição. Exemplo:
/items?after=abc123&limit=20→ começa a partir do item identificado porabc123. -
Vantagens:
- Muito eficiente em grandes volumes de dados.
- Evita inconsistência em dados dinâmicos (pois o cursor aponta para um item real, não um índice).
- Melhor para APIs em tempo real (redes sociais, streams, etc.).
-
Desvantagens:
- Mais complexo de implementar.
- Não é fácil “pular para a página 10” — só dá para avançar ou voltar com base nos cursores.
✅ Resumo prático:
- Page-based: bom para interfaces simples (ex: sites de e-commerce).
- Offset-based: bom para consultas ad hoc, mas pesado em bases grandes.
- Cursor-based: ideal para APIs modernas e dados dinâmicos/volumosos.
Exemplos usando Postgres
-- Tabela de exemplo
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC(10,2) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- Índices úteis
CREATE INDEX ON products (created_at, id);
Page-based
-- params: :page, :limit
-- ex: page=3, limit=20 => OFFSET = 40
SELECT id, name, price, created_at
FROM products
ORDER BY created_at DESC, id DESC
LIMIT :limit
OFFSET (:page - 1) * :limit;
Offset-based
-- params: :offset, :limit
-- ex: offset=40, limit=20
SELECT id, name, price, created_at
FROM products
ORDER BY created_at DESC, id DESC
LIMIT :limit
OFFSET :offset;
O banco de dados faz toda a busca pelo banco com where order e depois aplica o offset
Cursor-based (keyset/seek pagination)
- Cursor por coluna temporal + desempate por id
-- params: :limit
SELECT id, name, price, created_at
FROM products
ORDER BY created_at DESC, id DESC
LIMIT :limit;