2015-05-04 14 views
7

Der beste Ansatz zum Speichern mehrerer Benutzerdaten ist pro Benutzer und Datenbank. Ich verwende diesen Ansatz.Wie man pouchdb und couchdb Synchronisation verwaltet?

Ich habe Couchdb auf Server und Pouchdb für mobile Anwendung. Ich pflege jede Benutzerdaten, indem ich eine eigene Datenbank für den Benutzer in pouchdb und couchdb erstelle. Das heißt, ich habe mehrere Datenbanken in couchdb und eine Datenbank in pouchdb.

in der Regel in der Datenbank Benutzerdaten sqlbase ist in verschiedenen verschiedenen Tabelle gespeichert.

so in nosql pouchdb Ich erstelle Dokument für jede Tabelle.

tatsächliches Problem, das ich bin vor ist:

Ich habe ein Dokument in jeder Datenbank, die die Geschäfte des Benutzers speichert.

Die Client-Transaktion wird in pouchdb gespeichert, wenn sie offline ist und wenn die Anwendung Online-Transaktionssynchronisierung mit der couchdb-Benutzerdatenbank im Transaktionsdokument erhält.

Daten in Transaktionsdokument gespeichert wird wie folgt

{ 
    "_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":"" 
    }] 
} 

diese Transaktion auf Server-Seite ausgeführt All ist und das Ergebnis wird in diesen document.when jemals eine neue Transaktion aktualisiert durchgeführt i speichert sie in Transaktionsdokument in Daten Attribut.

Jetzt habe ich 1 Transaktion in Pouch und Couchdb beide bedeutet, beide sind synchron.

Jetzt, wenn mobile Anwendung offline ist, führen Sie Offline-Transaktion, die in Pouchdb Transaktionsdokument gespeichert ist.

und auf der Serverseite, dass 1 Transaktion erfolgreich aktualisiert wird.

Jetzt, wenn Anwendung online geht und Synchronisierung durchführen, verliere ich meine serverseitigen Änderungen und schließlich Daten in Transaktion doc ist wie Client pouchdb.

Hier verliere ich Server-Side-Daten. Also, was ist ein guter Ansatz oder wie kann ich es lösen?

enter image description here enter image description here

Antwort

6

Was passiert, ist, dass man Konflikte zu demselben Dokument, weil es in einer Art und Weise durch den Server und eine andere Art und Weise durch die Kunden modifiziert wird. Eine widersprüchliche Version gewinnt willkürlich und die andere verliert.

Sie können entweder resolve the conflicts oder (die sinnvollere Lösung in Ihrem Fall) mehrere Dokumente pro Benutzer anstelle von einem großen Dokument speichern.

Nur weil Sie eine Datenbank pro Benutzer haben, bedeutet das nicht, dass Sie ein Dokument pro Benutzer benötigen. :) Z. B Ihre Dokumente könnten sein:

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

Diese Dokumente einmal auf dem Client erstellt werden würden, und einmal auf dem Server aktualisiert. Keine Möglichkeit von Konflikten. Stück Kuchen!

+0

Ich bin mir auch dieser Vorgehensweise bewusst, und es ist am besten, aber ich habe viele Dokumente in der Benutzerdatenbank wie Transaktion.sollte ich also für jeden Datensatz ein eigenes Dokument verwenden? und wie man mehrere Tabellendaten verwaltet, kannst du mir erklären, dass ich darüber verwirrt bin. –

+0

Sie können für jede Sitzung-Geräte-Kombination ein separates Dokument haben - und jedes Dokument enthält mehrere Transaktionsdatensätze, die später mapporeduziert werden, um den endgültigen Transaktionszustand zu erhalten. Dieser Ansatz a) erzeugt weniger Dokumente (die Anzahl der Dokumente in DB beeinflusst die Leistungsfähigkeit des Pouch); b) erzeugt weniger Verkehr; c) erzeugt keine Konflikte. – ermouth

Verwandte Themen