Kā veidot sinhronizāciju starp divām tabulām

Nācās veidot sinhronizāciju starp divām DB un izrādījās, ka nav tik vienkārši to izdarīt tā vienkārši piesēžoties un uztaisot. Tāpēc nolēmu padalīties ar pieredzu un daudz maz saprotamā veidā uzrakstīt kā to varētu darīt, protams, katram var būt savu ideju. Iespējams ir labāks un efektīvāks risinājums, nu šis ir tas pie kā esmu nonācis caur savu pieredzi.

Katrai tabulai jāpievieno šādi lauki papildus jau esošajiem:

  • local_id – lokālā ieraksta ID,
  • remote_id – attālinātā objekta ID,
  • created_at – izvedošanas datums,
  • updated_at – atjaunošanas datums,
  • conflict – konflikta numurs.

created_at un updated_at lauku vērtības automātiski vajadzētu automātiski ierakstīt veidojot vai labojot ierakstu. updated_at lauks var palikt arī tukšs jaunizveidotiem ierakstiem, un created_at lauks nedrīkstmainīties labojot ierakstu.
Atsevišķā vietā vajadzētu glabāt pēdējo sinhronizēšanas laiku (last_stamp) tabulai, ko vajadzētu piefiksēt tieši pirms katras datu atlases no attālinātās tabulas.
Ierakstu veidošana. Atlasot datus pirmo reizi šis laiks nav, bet katru nākamo reizi nav nepieciešams atlasīt visus datus, bet gan tikai tos, kas pārsniedz šo iepriekšējo vērtību, tas ir, vai nu created_at (jauns attālināts ieraksts) vai arī updated_at (ieraksts ir attālināti labots).

Veidojot lokālu ierakstu, papildus parastajām darbībām ir jāveic šādas:

  • remote_id lauka vērtība ieraksta ID (jaunam lokālajam ierakstam abu šo lauku vērtības sakrīt);
  • local_id lauka vērtība ir ieraksta ID vērtība.

Lokāli jauni izveidotam ieraktam ID, local_id un remote_id ir vienādi. Šķiet mazliet muļķīgi, kāpēc gan tas būtu vajadzīgs? Bet būtībā katrs šis _id palīdzēs identificēt ierakstu vienalga kur tas atradīsies un ļaus viennozīmīgi to izdarīt.
Ierakstu atlasīšana.

Veidojot attālināto ierakstu jāizdara sekojošas darbības:

  • remote_id lauka vērtība ir attālinātā lauka ID vērtība;
  • īstā ID vērtība tiek veidota tāpat kā lokālajiem ierakstiem (automātiski, vai pēc kādas iepriekš definētas shēmas);
  • attālinātā ieraksta ID vērtību NEDRĪKST ierakstīt ID laukā, jo citādi tas var radīt konfliku lokālo ID starpā, kā arī tas nav vajadzīgs, jo tas jau tiek ierastīts citā laukā;
  • local_id lauks paliek tukšs.

 

Attālināto datu salīdzināšana ar lokālajiem datiem.

sinhronizacija

 

Laukus, kas glabā _id uz citām tabulām (ārējās atslēgas) vajag atjaunot sādi:

  • ārējā tabula uz kuru ir atslēga netiek sinhronizēta
    • nedrīkst mainīt – kļūda
  • tabula tiek sinhronizēta
    • ārējo tabulu saista pie remote_id nevis pie ID kā parasti, jo tādējādi atslēga būs pareizi gan lokāli, gan attālināti
    • droši var mainīt atslēgu, jo otrā tabulā mainīsies remote_id pie tās tabulas sinhronizācijas

 

Tabula ir saistīta ar citu tabulu, kurā ir _id uz šo tabulu.

  • ārējā tabula jāsaista pie šīs tabulas remote_id
  • mainoties remote_id ir jānomaina ārējās tabulas _id lauku vērtības uz šo jauno vērtību

 

Konflikti un to risināšana

Konflikti tiek glabāti laukā conflict. Tie vienmēr ir pa pāriem, viens ieraksts ir lokālais ieraksts otrs ir ārējais ieraksts. Lai nerastos kļūdas datu salīdzināšanā uz saistībā, tad risinot konfliktu ir jāpārnes pareizās izmaiņas no ieraksta ar lielāku ID uz ierakstu ar mazāku ID un pēdējais ir jāizdzēš un conflict lauks ir jāuzliek uz NULL. Pie datu atlases no ārējās tabulas ir jāignorē ieraksti kuriem conflict lauka vērtība ir lielāka par 1.

Iespējams esmu kaut ko piemirsis, bet principā no savas rūgtās pieredzes varu teikt, ka šis darbojas. Protams, varat dalīties ar idejām.

Atbildēt

Jūsu e-pasta adrese netiks publicēta.