Der Hashwert ist zwar ganz nett, aber dann muss jeder Client die gesamten Hashwerte vom Server laden, vergleichen und dann den passenden Datensatz nochmals vom Server holen.
Das mag bei wenigen Datensätzen und Clients funktionieren ... aber wenn die Anzahl Datensätze/Clients zunimmt kann man sich auch schön die Bandbreite damit verhageln.
Hier meine Vorschläge zur Synchronisation mit minimalem Overhead:
Zeitstempel
Der Client fragt beim Server alle Datensätze ab, die neuer als der letzte Zeitstempel sind.
Von diesen Daten wird der aktuellste Zeitstempel (vom Server vergeben) als letzter Zeitstempel beim Client gespeichert (nicht die Uhrzeit der letzten Abfrage!)
Hauptproblem bei der Synchronisierung via Zeitstempel bleibt aber die Auflösung des Zeitstempels.
Ein
MySQL Server schafft ja (je nach Hardware) mehr als einen Datensatz pro Millisekunde zu speichern.
xxx1 Client A schreibt Datensatz
xxx2 Client B bekommt die Datensätze geliefert (höchster Zeitstempel xxx)
xxx3 Client A schreibt Datensatz
Bei der nächsten Abfrage bekommt Client B aber nicht den 2. Datensatz von A geliefert, denn dieser Datensatz hat ja auch den Zeitstempel xxx obwohl er nach der Abfrage von Client B geschrieben wurde.
Somit müsste also die Abfrage nicht Zeitstempel > xxx lauten, sondern Zeitstempel >= xxx.
Damit bekommt man aber wieder ein entsprechenden Overhead, den man evtl. vermeiden möchte/muss.
Ein Ausweg aus diesem Zeitstempel-Dilemma geht dann nur über
Update-Liste pro Client
In einer Update-Tabelle werden alle Änderungen der Haupt-Tabelle auf dem Server (per Trigger) in diese Update-Tabelle eingetragen. Der Client fragt mit dieser Tabelle die Datensätze ab und löscht dann die verarbeiteten Sätze aus der Tabelle.
Dadurch hat man dann auch das Weitergeben von Löschsätzen charmant gelöst, denn diese können sofort aus der Haupttabelle entfernt werden.
Müssen mehrere Tabellen synchronisiert werden, dann eben den Tabellen-Namen mit in die Update-Tabelle, oder eine UUID als ID verwenden.
Code:
ClientID PK
RecordID PK
DeleteFlag