Mantenere ripetibile l'impaginazione se vengono eseguite operazioni di modifica

StackOverflow https://stackoverflow.com/questions/84615

  •  01-07-2019
  •  | 
  •  

Domanda

Se si desidera impaginare i risultati da un'origine dati che supporta l'impaginazione, è necessario procedere a un processo di:

  1. definire la dimensione della pagina, ovvero il numero di risultati da mostrare per pagina;
  2. recupera ogni pagina richiesta dall'utente utilizzando un offset = numero di pagina (in base 0) * dimensione della pagina
  3. mostra i risultati della pagina recuperata.

Tutto questo funziona perfettamente senza considerare il fatto che un'operazione può influenzare il sistema backend che rovina l'impaginazione in atto.Sto parlando di qualcuno che inserisce dati tra i recuperi delle pagine o elimina i dati.

page_size = 10;
get page 0 -> results from 0 to 9;
user inserts a record that due to the query being executed goes to page 0 - the one just shown;
get page 1 -> results from 10 to 19 - the first results on the page is the result on the old page 0.

Il comportamento descritto può creare confusione allo spettatore.Conoscete qualche soluzione pratica per aggirare questo problema.

È stato utile?

Soluzione

Ci sono alcune scuole di pensiero su questo.

  1. i dati vengono aggiornati, lascialo stare
  2. È possibile implementare una sorta di metodo di memorizzazione nella cache che contenga l'intero set di risultati (questa potrebbe non essere un'opzione se si lavora con set di dati davvero grandi)
  3. È possibile eseguire un confronto su ciascuna operazione di pagina e avvisare l'utente se il conteggio dei record totali cambia

.

Altri suggerimenti

Se gli aggiornamenti che ti interessano sono principalmente nuovi inserimenti (ad esempio, StackOverflow stesso sembra soffrire di questo problema quando si sfogliano le domande e arrivano nuove domande) un modo per gestirlo è acquisire un timestamp quando si esegue la prima query di impaginazione , quindi limitare i risultati delle richieste per le pagine successive agli elementi esistenti prima di tale timestamp.

Finché gli utenti comprendono che i dati sottostanti cambiano continuamente, non saranno confusi.Quindi fallo nel modo più semplice.

Potresti memorizzare nella cache le prime pagine del risultato e utilizzarle per le visualizzazioni successive, ma in questo caso i risultati non saranno sincronizzati con il database, il che crea ancora più confusione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top