PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgres:usando timestamps para paginação


Deixe-me reescrever as coisas dos comentários para a minha resposta. Você deseja usar timestamp digite em vez de integer simplesmente porque é exatamente para isso que ele foi projetado. Fazendo conversões manuais entre inteiros timestamp e timestamp objetos é apenas uma dor e você não ganha nada. E você precisará dele eventualmente para consultas baseadas em data e hora mais complexas.

Para responder a uma pergunta sobre paginação. Você simplesmente faz uma consulta
SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30

Se for a primeira consulta, você define lastTimestamp = '3000-01-01' . Caso contrário, você define lastTimestamp = last_query.last_row.created .

Otimização

Observe que, se a tabela for grande, ORDER BY created DESC pode não ser eficiente (especialmente se chamado paralelamente com diferentes intervalos). Nesse caso, você pode usar "janelas de tempo" móveis, por exemplo:
SELECT *
FROM table_name
WHERE
    created < lastTimestamp
    AND created >= lastTimestamp - interval '1 day'

O 1 day intervalo é escolhido arbitrariamente (ajuste-o às suas necessidades). Você também pode classificar os resultados no aplicativo.

Se os resultados não estiverem vazios, você atualiza (no seu aplicativo)
lastTimestamp = last_query.last_row.created

(supondo que você tenha feito a classificação, caso contrário você leva min(last_query.row.created) )

Se os resultados estiverem vazios, repita a consulta com lastTimestamp = lastTimestamp - interval '1 day' até pegar alguma coisa. Além disso, você deve parar se lastTimestamp torna-se baixo, ou seja, quando é menor que qualquer outro carimbo de data/hora na tabela (que deve ser pré-buscado).

Tudo isso está sob algumas suposições para inserções:
  1. new_row.created >= any_row.created e
  2. new_row.created ~ current_time
  3. A distribuição de new_row.created é mais ou menos uniforme

A suposição 1 garante que a paginação resulte em dados consistentes, enquanto a suposição 2 é necessária apenas para o padrão 3000-01-01 encontro. A suposição 3 é garantir que você não tenha grandes lacunas vazias quando tiver que emitir muitas consultas vazias.