Qual è il modo migliore per tenere traccia degli aggiornamenti durante la sincronizzazione dei dati dal server remoto MySQL al database SQLite locale?

1

Sto realizzando un'app per iOS, beh, in realtà due. L'App A sarà in grado di scrivere TO-DO su un database MySQL remoto, e l'App B sarà in grado di leggere ciò che l'App A ha scritto / modificato. L'app B deve essere sempre aggiornata e ci possono essere più di un'istanza di App B in esecuzione su diversi iDevice. L'app B ha archiviato la copia quasi esatta di ciò che l'App A ha scritto sul DB MySQL remoto, in un DB SQLite locale. Le operazioni MySQL sono gestite da un semplice script PHP. Il problema è come aggiornare il DB locale dell'app B quando qualcosa cambia nel database MySQL remoto (ovvero quando l'app A scrive qualcosa di nuovo o modifica qualcosa esistente). Ho trovato due soluzioni possibili: la prima è di dire al PHP l'last_row_id (l'id dell'ultima riga che l'App B ha ricevuto dal server) in modo che il PHP possa chiedere a MySQL di ottenere tutte le righe con un ID maggiore ( ID è un valore di incremento automatico sulla tabella MySQL).

Ma ... Questo non aiuterà a scoprire gli elementi modificati.

La seconda soluzione che ho pensato è stata quella di mettere una colonna "last_updated" su MySQL con un timestamp e aggiornarla ogni volta che la riga cambia. L'app B dovrebbe memorizzare il timestamp dell'ultima sincronizzazione e riportare questo valore a PHP in modo che possa richiedere a MySQL tutte le righe che hanno una data / ora maggiore di quella che riceve dall'app B.

Ma ... Entrambe le soluzioni falliscono quando MySQL è in cluster e in cluster (e questo è quello che mi interessa di più). L'approccio di auto-incremento dell'ID fallisce perché non sarà più progressivo (vedi auto_increment_offset e auto_increment_increment), e l'approccio di timestamp non sarebbe affidabile perché l'orologio può essere fuori sincrono su qualsiasi server MySQL.

Come risolveresti questo problema in modo affidabile?

    
posta Alex 03.08.2015 - 11:49
fonte

3 risposte

1

Invece di fare affidamento su un campo Data / ora aggiornato, utilizzare un campo Numero versione. Quando viene creato, è 1 e poi incrementato con ogni aggiornamento. Non è difficile da fare a livello di database.

L'app di monitoraggio traccia solo la chiave primaria & Numero di versione per ogni record e fa un confronto periodico.

Potrebbe trattarsi di un controllo per gestire una modifica dei dati da parte di un utente mentre l'altro utente non dispone di nuovi dati. Fondamentalmente tutti gli aggiornamenti non sono consentiti se il loro numero di versione non corrisponde al numero corrente. Viene verificato prima che il nuovo record incrementi il valore.

    
risposta data 29.02.2016 - 19:00
fonte
0

Filtri Bloom invertibili, ad esempio, per questo documento .

Il video del sistema dei nomi GNU da 30c3 ha un'introduzione Il server aggiunge le chiavi primarie dei record che ha su un filtro. Il client invia le chiavi primarie del server dei record del client. Il server rimuove quelli dal filtro. Ciò che rimane sono i record da inviare al cliente.

Per ridurre la larghezza di banda utilizzata, è possibile memorizzare timestamp più grossolani. Ad esempio, invia solo i record a partire dalla settimana prima dell'ultima sincronizzazione. Quindi funzionerà anche se i tuoi orologi sono disattivati di diversi giorni.

    
risposta data 03.08.2015 - 12:10
fonte
0

Puoi creare una tabella di log delle transazioni con guids che memorizza le modifiche apportate e da chi e quando (e su quale tabella / entità se decidi di scomporlo).

es: LOGID | trantype | OldValue | newvalue | datetime | utente {guidxx1234} | update | {x = 1, y = 5} | {x = 1, y = 7} | yyyymmdd hh: mm | username o id {guidxx1235} | insert | {} | {x = 45, y = 7} | yyyymmdd hh: mm | username o id

Il processo di sincronizzazione dovrebbe ripopolare le modifiche apportate nel database locale al database del server confrontando le transazioni mancanti in questo registro.

Questo potrebbe non essere necessariamente il modo migliore per te, ma abbastanza facile da implementare indipendentemente dal vendor db.

    
risposta data 03.08.2015 - 15:11
fonte

Leggi altre domande sui tag