2015-05-04 56 views
7

Najlepsze podejście do przechowywania wielu danych użytkownika dla każdego użytkownika na bazę danych. Używam tego samego podejścia.Jak zarządzać synchronizacją pouchdb i couchdb?

Mam couchdb na serwerze i pouchdb dla aplikacji mobilnej. Utrzymuję dane każdego użytkownika, tworząc osobną bazę danych dla użytkownika w pouchdb i couchdb. To oznacza, że ​​mam wiele baz danych w couchdb i jedną bazę danych w pouchdb.

zwykle w bazie danych bazy danych sqlbase jest przechowywana w różnych tabelach.

tak w nosql pouchdb tworzę dokument dla każdej tabeli.

rzeczywisty problem jestem stoi to:

Mam jeden dokument w każdej bazy danych, która przechowuje transakcji użytkownika.

Transakcja klienta jest przechowywana w pouchdb, gdy jest ona w trybie offline, a aplikacja pobiera synchronizację transakcji on-line z bazą danych użytkownika couchdb w dokumencie transakcji.

dane są przechowywane w dokumencie transakcji jest następująca

{ 
    "_id":"transaction ", 
    "_rev":"1-3e5e140d50bf6a4d873f0c0f3e3deb8c", 
    "data":[ 
    { 
     "transaction_id":"tran_1", 
     "transaction_name":"approve item", 
     "status":"Pending", 
     "ResultMsg":"" 
    }, 
    { 
     "transaction_id":"tran_2", 
     "transaction_name":"approve item", 
     "status":"Pending", 
     "ResultMsg":"" 
    }] 
} 

Wszystko to transakcja wykonywana jest po stronie serwera, a wynik jest aktualizowana w tych document.when kiedykolwiek każda nowa transakcja wykonywana i przechowywać go w dokumencie transakcji w danych atrybut.

Teraz mam 1 transakcji w etui i couchdb oznacza, że ​​oba są zsynchronizowane.

Teraz, gdy aplikacja mobilna jest w trybie offline, wykonuje transakcję offline, która jest przechowywana w dokumencie transakcyjnym pouchdb.

i po stronie serwera, że ​​1 transakcja została zaktualizowana do sukcesu.

Teraz, gdy aplikacja przechodzi do trybu on-line i wykonuje synchronizację, tracę zmiany po stronie serwera, a na końcu dane w dokumencie transakcyjnym są jako klient pouchdb.

Tutaj tracę dane po stronie serwera. więc co to jest dobre podejście lub jak mogę to rozwiązać.

enter image description here enter image description here

Odpowiedz

6

Co się dzieje jest to, że masz konfliktów do tego samego dokumentu, ponieważ jest on w jakiś sposób zmodyfikowane przez serwer i inny sposób przez klienta. Jedna sprzeczna wersja wygrywa arbitralnie, a druga przegrywa.

Możesz albo resolve the conflicts lub (bardziej rozsądne rozwiązanie w twoim przypadku) przechowywać wiele dokumentów na użytkownika zamiast jednego dużego dokumentu.

Tylko dlatego, że masz jedną bazę danych na użytkownika, nie oznacza to, że musisz mieć jeden dokument na użytkownika. :) Np swoje dokumenty mogą być:

{_id: "Tran_1", status: "Pending"} 
{_id: "Tran_2", status: "Pending"} 
// etc. 

Dokumenty te zostaną utworzone, gdy na kliencie i aktualizowane raz na serwerze. Brak możliwości konfliktów. Bułka z masłem!

+0

Jestem również świadomy tego podejścia i najlepiej, ale mam wiele dokumentów w bazie danych użytkowników, takich jak transakcja.więc czy powinienem używać oddzielnego dokumentu dla każdego rekordu? i jak zarządzać wieloma danymi tabeli? możesz mi wyjaśnić, że jestem zdezorientowany. –

+0

Możesz mieć oddzielny dokument dla każdej kombinacji sesja-urządzenie - a każdy dokument zawiera kilka rekordów transakcji, które później są mapowane w celu uzyskania ostatecznego stanu transakcji. To podejście a) generuje mniej dokumentów (liczba dokumentów w DB wpływa na wydajność w kieszeniach); b) generuje mniejszy ruch; c) nie powoduje konfliktów. – ermouth