詳細検索

Uma Breve Introdução à Paginação

Avatar
por Chen Ziyu

Uma Breve Introdução à Paginação
Traduzido do English • Ver original

Para muitos engenheiros de software, endpoints para recuperar listas de entidades provavelmente são os favoritos para implementar — tudo o que precisam fazer é construir uma instrução SQL que reúna todos os itens disponíveis, junto com outras tarefas menores. É tudo diversão até que o número de entidades no banco de dados se torne um gargalo, onde cada requisição GET retorna dezenas de milhares de itens. Você começa a ver logs do lado do servidor bombardeados com mensagens de erro destacadas em vermelho. Seus queridos usuários, antes satisfeitos com sua aplicação, começam a reclamar do desempenho cada vez mais fraco. Seu gerente de produto está à beira de perder a cabeça e descontar a frustração em você. O quê?! Você diz que quer evitar que tudo isso aconteça? Paginação é o que você precisa! Ela pode melhorar drasticamente o desempenho dos seus endpoints e salvar seus servidores da sobrecarga. Hoje, vou definir paginação e apresentar as técnicas de paginação mais comuns.

O que é paginação?

Vamos começar com uma visão geral básica da paginação. Paginação é uma técnica que busca dividir um grande conjunto de resultados em partes menores e mais gerenciáveis. Em termos simples, paginação é a divisão de grandes quantidades de dados em várias partes, ou "páginas", como o nome sugere. Alguns de vocês podem querer perguntar: "Por que precisamos complicar nosso código incluindo paginação? Por que não podemos escolher o caminho mais fácil, entregando todos os registros aos nossos usuários e pronto?" Existem principalmente dois motivos. Primeiro, é mais fácil para os usuários identificar as informações de que precisam em uma tabela paginada, melhorando assim a experiência geral do usuário. Segundo, a paginação ajuda a diminuir o número médio de itens retornados. Além de aumentar a velocidade da entrega dos dados, também ajuda a economizar recursos para transferir grandes quantidades de dados.

Paginação Frontend vs. Paginação Backend

A paginação pode ocorrer tanto no frontend quanto no backend. Antes de entrarmos em como devemos abordar a paginação, preciso diferenciar entre paginação frontend e backend. A paginação frontend foca em melhorar a percepção visual dos usuários, mostrando informações em partes facilmente digeríveis, o que está mais relacionado ao design de UI/UX. Por outro lado, o principal objetivo da paginação backend é evitar servidores backend sobrecarregados e aumentar a eficiência da transferência de dados. Comparado à sua contraparte frontend, a paginação backend é mais relevante para nós, engenheiros. Na próxima seção, vou apresentar principalmente técnicas de paginação backend. (Se você também tem interesse em paginação frontend, sinta-se à vontade para discutir isso com os designers de UI/UX da sua empresa. Eles provavelmente ficarão mais do que felizes em esclarecer você sobre esse tema.)

Como implementar paginação no backend?

Existem muitas maneiras diferentes de implementar a paginação para seus endpoints. Aqui, vou abordar algumas das técnicas de paginação mais comuns.

Paginação baseada em deslocamento

A paginação baseada em offset é uma das técnicas de paginação mais simples. Usuários de endpoints aproveitam offset e limite para comunicar aos endpoints qual página de dados precisam. O offset indica o número de registros a pular antes dos dados de destino. O limite determina o número máximo de registros em uma página.

Ao construir instruções SQL para recuperar dados paginados, podemos utilizar diretamente esses dois parâmetros. Digamos que queremos recuperar dados da tabela 'users'. Queremos obter a terceira página de dados, e cada página contém dez registros. Nesse caso, podemos escrever a seguinte instrução SQL para obter os dados desejados.

SELECT * DOS usuários
ORDEM PELA id ASC
LIMITE 10
DESLOCAMENTO 20; 

O limite é 10 porque, para cada página, só recuperamos 10 registros da tabela 'users'. O deslocamento é 20 porque precisamos pular as duas primeiras páginas, cada uma contendo dez linhas, para obter a terceira página de 10 registros.

Vantagens da paginação baseada em deslocamento:

A paginação baseada em offset é fácil de implementar porque podemos usar diretamente 'offset' e 'limit' para construir instruções SQL. Não há nenhuma lógica complexa envolvida. Usuários de um endpoint com paginação baseada em offset implementada podem escolher pular para qualquer página. Você pode considerar isso como uma qualidade universal compartilhada por todas as técnicas de paginação, mas algumas técnicas de paginação não possuem essa qualidade, como vou demonstrar mais adiante.

Desvantagens da Paginação Baseada em Deslocamento:

A paginação baseada em offset sofre de baixo desempenho, especialmente quando o deslocamento é um número grande. A razão é simples: o banco de dados precisa consultar as linhas (deslocamento) para serem puladas junto com os dados de destino, apenas para descartá-los eventualmente, o que gera um desperdício de recursos computacionais. A paginação baseada em offset tende a devolver resultados inconsistentes. Vou usar os dois exemplos a seguir para demonstrar o porquê: a. Exclusão de dados: Suponha que um usuário esteja visualizando a primeira página quando alguém exclui um registro da primeira página. Então o primeiro registro na segunda página se tornará o último registro da primeira página por causa do registro deletado. Quando o usuário navega para a segunda página, ele não verá o primeiro registro original. b. Inserção de dados: Suponha que um usuário esteja visualizando a primeira página quando alguém insere um registro na primeira página. Então o último registro na primeira página será deslocado para trás para a segunda página. Quando o usuário navegar para a segunda página, ele verá novamente o último registro da primeira página, o que não deveria acontecer.

Paginação baseada em páginas

A paginação baseada em página é essencialmente a mesma que a paginação baseada em deslocamento. A única diferença é que a paginação baseada em páginas usa números de página para acompanhar a página atual que o usuário está visualizando. Podemos facilmente converter um número de página em um deslocamento usando a seguinte fórmula:

deslocamento = (número da página - 1) * limite

Paginação baseada em cursor

Paginação baseada em cursor é uma técnica de paginação que utiliza cursores, ou ponteiros, para acompanhar o último registro que os usuários de endpoint veem usando cursores. Um cursor geralmente contém as seguintes informações: as colunas usadas para identificar a localização do cursor e seus valores correspondentes (deve haver pelo menos uma coluna única para garantir a unicidade do cursor) Em que ordem (ascendente ou descendente) os resultados são ordenados com base nessas colunas. Se o usuário do endpoint solicita resultados na frente ou atrás do cursor. Aqui está um exemplo:

{ 
   "colunas":[ 
      { 
         "nome":"apelido", 
         "valor": "Shawn", 
         "is_ascending":verdade
      }, 
      { 
         "nome":"id", 
         "valor":"23bf6f87-a4f5-4a9f-b441-1c98f7027e04", 
         "is_ascending":verdade
      }
   ], 
   "is_backward":falso
}

Esse cursor permite que usuários de endpoint recuperem dados ordenados por apelido e ID em ordem crescente atrás da linha com os seguintes valores de coluna:

coluna de apelidos: "Shawn" 
Coluna de ID: "23bf6f87-a4f5-4a9f-b441-1c98f7027e04" 

Por favor, note que incluir apenas a coluna de apelido pode ser insuficiente aqui, pois a coluna de apelido provavelmente conterá valores duplicados. Sem um cursor único, o banco de dados não consegue localizar os dados solicitados com certeza. Adicionar a coluna ID como identificador secundário garante a unicidade do cursor.

Os endpoints precisam calcular e retornar cursores para ir para frente e para frente junto com os dados paginados, para que os usuários do endpoint possam navegar facilmente pelos registros da sua fonte de dados.

Vantagens da paginação baseada em cusor:

A paginação baseada em cursor geralmente tem o melhor desempenho entre todas as técnicas de paginação, especialmente quando há muitos registros no banco de dados. A razão é que, ao contrário da paginação baseada em deslocamento, a paginação baseada em cursor não precisa consultar dados indesejados apenas para descartá-los. O uso de cursores permite que a paginação baseada em cursor identifique e recupere eficientemente os registros solicitados. A paginação baseada em cursor é resistente a mudanças de linha porque não usa deslocamento para determinar quais linhas devolver. Mesmo com linhas antigas removidas ou novas fileiras adicionadas, a paginação baseada em cursor não pula uma linha nem exibe a mesma linha em duas páginas diferentes.

Desvantagens da Paginação Baseada em Cursor,

A implementação da paginação baseada em cursor é bastante complicada. (É tão complicado que sinto necessidade de cobrir isso em um blog técnico separado para evitar que este fique muito longo. Fiquem ligados!)

Usuários de endpoints não podem pular para uma página específica, pois toda a navegação depende de cursores para frente e para trás.

Qual técnica de paginação devo usar?

A regra prática é implementar paginação baseada em offset (ou em página) quando você não espera que o número de registros cresça exponencialmente à medida que o número de usuários aumenta ou quando é vital permitir que os usuários pulem para qualquer página. Caso contrário, a paginação baseada em cursor seria uma escolha melhor porque tem desempenho superior.

Resumo

Neste artigo, comecei explicando o que a paginação faz e por que ela é necessária. Depois, apresentei algumas das técnicas de paginação mais usadas e suas respectivas vantagens e desvantagens. Depois disso, dei alguns conselhos sobre quando usar qual técnica de paginação. Espero que este artigo tenha dado informações suficientes para que você tome decisões informadas sobre se e como implementar a paginação para seus endpoints.

Related Articles