2017-10-25 1 views
1

Ich beginne gerade mit CouchDB (2.1), und ich plane, damit vertrauliche Daten pro Benutzer von einer mobilen App auf meinen Server zu replizieren. Ich habe gelesen, dass Datenbanken pro Benutzer der beste Weg sind, um dies zu tun, und ich habe das eingerichtet. Jede Datenbank enthält eine Mischung aus vom Benutzer erstellten Dokumenten der Typen Foo und Bar.Kombinieren CouchDB Datenbanken mit Replikation während der Aufnahme Quell-db

Jetzt möchte ich auch in der Lage sein, Multi-User-Slices dieser Daten in einer Datenbank zusammenzufassen und Ansichten für das Admin-Reporting zu erstellen. Sagen wir, ich möchte eine Datenbank, die alle Foos von allen Benutzern enthält. So weit, so gut, ein Eintrag in _replicator mit einem Filter von jeder Benutzerdatenbank zu einem Ziel erfüllt die Aufgabe.

Aber mit Blick auf die kombinierte Datenbank kann ich nicht sagen, aus welchem ​​Benutzer ein bestimmtes Foo stammt. Ich könnte die Benutzer-ID in jedes Dokument innerhalb der Benutzer-Datenbank schreiben, aber das scheint redundant zu sein und fügt die Komplexität der Validierung hinzu. Gibt es einen anderen Weg?

Antwort

1

Der Replikator von CouchDB versucht einfach, den exakten Zustand eines bestimmten Dokuments in der Zieldatenbank abzugleichen - und wenn nicht, speichert er den genauen Quellinhalt (als konfliktreiche Version).

Darüber hinaus basiert das Feld _rev eines Dokuments, das das Replikationssystem verwendet, um zu überprüfen, ob ein Dokument aktualisiert werden muss, tatsächlich auf (ein Hash über) die anderen Dokumentfelder.

So können Sie leider keine Metadaten während Replikation hinzufügen. Dies wäre in der Tat nützlich für diese und andere per-user vs. shared replication Situationen, aber es ist nicht etwas, das CouchDB derzeit unterstützt, und es würde einige Optimierungen brechen, um Unterstützung dafür hinzuzufügen.

Ich könnte die Benutzer-ID in jedes Dokument innerhalb der Benutzer-Datenbank schreiben, aber das scheint redundant und fügt die Komplexität der Validierung hinzu. Gibt es einen anderen Weg?

Das Einfügen eines Felds wie etwa .user in jedes Dokument ist die richtige Lösung.

Soweit überflüssig, würde ich nicht auf diese Weise denken - oder zumindest nicht als eine schlechte Sache. Bei CouchDB (und wie bei anderen NoSQL-Stores) gibt es einen Trend, Daten zu "denormalisieren". Vor allem angesichts der Dinge, die die Replikation mir operationell und architektonisch ermöglicht, hätte ich lieber ein eigenständiges Dokument als eines, das auf Metadaten basiert, die von einem Datenbanknamen abgeleitet sind.

Ich bin mir nicht sicher, wie genau in Ihrem Fall ein zusätzliches Feld Validierung komplexer machen wird, so dass ich nicht vollständig damit sprechen kann. Sie tun wollen sicherstellen, dass der Benutzer das Dokument zu schreiben hat es "ehrlich gesagt", und ja, es gibt ein bisschen mehr Komplikationen, aber in der Regel nicht zu belastend in den meisten Fällen.

+0

Das ist hilfreich - danke. Nur um ein bisschen zu erarbeiten - ich bin glücklich mit dem Prinzip der Denormalisierung (von mongodb kommen), aber die Redundanz Problem für mich ist, dass, wenn ich replizieren von Client (Beutel) -> pro Benutzer-DB -> kombinierte db, dann Selbst die mobile App des Kunden muss viele (tausend) Kopien ihrer eigenen ID enthalten. Traditionsgemäß würde ich erwarten, dass der Server in diesem Fall die ID des authentifizierten Clients hinzufügt - das Hinzufügen der Clientseite zu jedem Dokument ist eine Menge nutzloser Daten vom Client-POV. Die Durchsetzung der Ehrlichkeit war die einzige Komplikation, die ich mir zur Validierung vorstellte, aber ich denke, das ist nicht allzu schwer. –

+0

Akzeptieren, da es aussieht, als gäbe es keinen besseren Weg und Ihre Antwort war sehr hilfreich, um zu verstehen warum.Würde gerne eine Bijektion als Teil des Replikations-Setups definieren, vielleicht kommt das auf Couch 3 oder 4;). Trotzdem danke! –

Verwandte Themen