Diciamo che abbiamo un unico numero di versione globale gestito dal server (in una tabella) e incrementa ogni transazione che è impegnata nel database.
E il database è configurato per mantenere anche una colonna del numero di versione in ogni tabella, in modo che ogni riga abbia un numero di versione. Ogni volta che una riga viene modificata o aggiunta, il numero di versione globale singolo per quella riga deve essere aggiornato al valore successivo per quel numero di versione globale singolo. (Una riga aggiornata avrà la sua colonna di versione aggiornata fino all'ultimo valore di versione in questione indipendentemente dal suo valore precedente.)
Inoltre, il server restituisce al client l'ultimo numero di quella singola versione generale su ciascuna query.
Quando si sincronizzano le informazioni sulla versione del client nella query, e quindi alle sue query dove clausole, per ciascuna tabella viene aggiunta una congiunzione che limita i risultati alle righe la cui versione delle modifiche è > = quel numero di versione.
Questo farà sì che il database faccia il lavoro di identificare le cose che sono cambiate dall'ultima versione (numero) data.
Il tuo chilometraggio varierà, poiché a volte i join ti vorrebbero la restrizione della versione e altre volte no (ad esempio una query a categorie di elementi, potresti volere articoli che cambiano, ma ottenere sempre tutte le loro categorie indipendentemente dalle modifiche nelle categorie ).
Quanto sopra fornisce un algoritmo per determinare esattamente cosa è cambiato dall'ultima sincronizzazione. Ora per quanto riguarda la domanda su quando sincronizzare. Come dice @CandidedOrange, il momento giusto per la sincronizzazione è quando si è verificato un cambiamento, poiché ora stiamo spingendo il cambiamento piuttosto che tirare / interrogare inutilmente.
Quindi, qualcuno, da qualche parte (il client o il server) deve capire l'ultima versione che ogni client ha effettivamente visto.
Come alluso a @CandidedOrange, il lavoro può essere suddiviso in due componenti:
(1) le notifiche del server cambiano, e spinge le notifiche. Se il server conosce il numero di versione più recente per ciascun client, può inviare le modifiche specifiche a ciascun client per i client che vedranno le modifiche (calcolandole secondo l'algoritmo precedente). Ma se il server non ha la versione più recente vista da ciascun client, quindi esegue il ping di tutto il client per provare un aggiornamento.
(2) Quando i client ricevono un ping, o ottengono il set di modifiche (se il server mantiene l'ultima versione del client) e nell'altro approccio il client si gira e tira le modifiche dal server con l'ultimo numero di versione del client, aggiornando come necessario.