2016-04-17 11 views
0

Einer meiner Mitspieler und ich hatte ein Gespräch über Ansichten in Couchbase zu schaffen für das Abrufen von Daten.Erstellen bestimmte Ansicht für bestimmte Abrufen von Daten in chouchbase

So war mein Vorschlag Ansicht für bestimmten Abruf von Daten zu schaffen, so es viel schneller sein würde und geradlinig. Zum Beispiel haben wir zwei verschiedene Leiter:

  • Admin für spezifische Gruppe
  • Super-Administrator

Admin Abrufen von Daten aus ihrer spezifischen Gruppe und Super-Administrator erhält Daten von allen der Gruppen.

Es wäre sinnvoll, admin nur für die Gruppe zu beschränken, um die Daten zu erhalten, die ihnen gehören, anstatt alle Daten zu erhalten, sie dann im Backend zu verarbeiten und zu vergleichen, welche zu einer Gruppe gehören.

Zum Beispiel: Couchbase Ansicht erstellen, die Gruppen-ID akzeptieren und alle seine Daten

Auf der anderen Seite abfragen, sie nur Ansichten erstellen, wenn es komplizierte Sachen wie Berechnung sind und Ansichten erstellen könnte schwierig sein aufrecht erhalten.

Da zur Zeit nur wir eine Ansicht verwenden, die alle Daten bekommen und sobald wir sie haben wir sie verarbeiten, indem spezifische Daten für die eine bestimmte Gruppe in dem Back-End bekommen LINQ verwenden.

Dokumentstruktur:

{ 
    "fooReference": "", 
    "groupId": 8, 
    "fooName": "projectTest", 
    "externalId": "PR572", 
    "fooDescription": "OG QGpCst vXAuu", 
    "property5": { 
     "property1": "124", 
     "code": "US", 
     "value": 267206, 
     "start": "2014-10-01T00:00:00Z", 
     "end": "2017-09-30T00:00:00Z" 
    }, 
    "property6": [ 
     "string1", 
     "string2", 
     "string14" 
    ], 
    "property7": [ 
    ], 
    "property8": [ 
    ], 
    "dateAdded": "2016-02-11T07:22:15.2483042Z", 
    "ownerId": 72, 
    "dateUpdated": "2016-02-11T07:22:15.2483042Z", 
    "property9": [ 
     { 
      "id": 72, 
      "type": 0 
     } 
    ], 
    "property10": false, 
    "id": "345", 
    "deleted": false, 
    "type": "Foo", 
    "subtype": "Foo" 
} 

Get Alle Abfrage:

function (doc, meta) { 
    if (doc.type == "Foo" && !doc.deleted) { 
    emit(meta.id, null); 
    } 
} 

Dies ist die Beispielabfrage ich vorschlagen möchte: Wenn ich es von groupId erhalten möchten , passiere einfach die groupId in emit

function(doc, meta) { 
    if (doc.type == "Foo" && !doc.deleted) { 
     emit(doc.groupId, doc); 
    } 
} 

Wenn ich externalId bekommen muss ich nur noch die die externalId passieren emit

function(doc, meta) { 
     if (doc.type == "Foo" && !doc.deleted) { 
      emit(doc.externalId, doc); 
     } 
    } 

diese Weise können wir verschiedene Abfragen mit unterschiedlichen Rollen zu bekommen Dokumente haben, und wir haben nicht nur um alle das Dokument von seiner id und verarbeiten sie im Back-End mit LINQ.

Beispiel in dem Prozess sich im Backend:

Abrufen die groupId:

var foos = _fooRepository.GetAll(); 
foos = foos.Where(s => s.GroupId == group.Id).ToList(); 

die externalId Anfahrt:

var foos = _fooRepository.GetAll(); 
foos = foos.Where(s => s.externalId == foo.externalId).ToList(); 

Hinweis: Irgendwie Leistung ist etwas wichtig für uns besonders beim Rendern von Seiten, die Daten für die Benutzer abrufen.

Also meine Frage ist, was ist der beste Ansatz für diese Art von Szenario?

+0

Um eine Antwort zu geben, müssen wir die Struktur Ihrer Dokumente und die Fragen, die Sie stellen möchten, kennen. Im Allgemeinen definiert eine Ansicht sowohl einen Index, mit dem bestimmte Dokumente effizient abgerufen werden können, als auch die klassische Datenbankansicht, nämlich eine Auswahl und Projektion von Dokumenten. Wenn sich Ihre Abfragen nur durch die Anfangs- und Endschlüsselwerte unterscheiden (z. B. Mitarbeiter nur einer Gruppe oder Mitarbeiter aller Gruppen), können Sie mit einer Ansicht arbeiten. Wenn die Abfragen strukturell unterschiedlich sind (sagen Mitarbeiter einer Gruppe oder Mitarbeiter nach akademischem Abschluss), benötigen Sie mehr. – TAM

+0

@TAM Ich habe meine Frage aktualisiert. kann nicht viel von der Dokumentstruktur bereitstellen, aber so sieht es aus. – rpmansion

Antwort

2

Ich habe Ihren Vorschlag nicht auf einem Live-System getestet, aber die Verwendung einer Ansicht für jeden Ihrer Abfragetypen sieht wie die Lehrbuchlösung für die Anforderungen aus, die Sie haben. Wenn Sie Abfragen für den Zugriff auf Ihre Daten über verschiedene Kriterien benötigen, definieren Sie eine Sicht für jeden Kriteriensatz.

Leistungsaspekte:

Raum: Ihre Ansichten werden jeweils erzeugen einen Index enthält, für jedes ausgewählte Dokument, das emittierte Wert und das Dokument-ID. Dies sollte im Vergleich zu Ihrem Gesamtdatenvolumen kein Problem darstellen. Die einzige Ausnahme dafür, die ich abbilden kann, wären extrem begrenzte Hardwareressourcen, z.B. wenn Ihre App auf einer eingebetteten Hardware in einem Auto ausgeführt wird, wo jeder Cent zählt.

Laufzeit: Die Gesamtsumme der Vorgänge in Ihrer Datenbank hängt von der Anzahl der Einfügungen und Aktualisierungen ab, die Ihren Index ändern, sowie der Anzahl der Abfragen für Ihre Daten und der Anzahl der von jeder Abfrage abgerufenen Datensätze. Wenn die Anzahl relevanter Einfüge-/Aktualisierungsoperationen die Anzahl der Abfragen übersteigt, erhöht der Index möglicherweise die Gesamtanzahl der Operationen. In den meisten Datenbankanwendungen gibt es jedoch wesentlich mehr Abfragen als das Ändern von Vorgängen. Daher wird jede Operation, die Ihren Index auf dem neuesten Stand hält, durch den geringeren Aufwand zur Auswahl der benötigten Daten mehr als kompensiert. Im Zweifelsfall können Sie eine grobe Schätzung der Anzahl der Einfüge-, Aktualisierungs- und Abfragevorgänge für Ihre Ansichten vornehmen.

Wenn Sie aus einer anderen Perspektive Daten nach bestimmten Kriterien auswählen müssen, gibt es zwei Möglichkeiten: In der Datenbank, in einer Ansicht oder in Ihrer Anwendung. Wenn Sie dies in Ihrer Anwendung tun, kommt es zu zwei Leistungsproblemen: Mehr Daten müssen von Ihrer Datenbank in Ihre Anwendung übertragen werden, und Ihre Anwendung muss einen Auswahlalgorithmus enthalten, der höchstwahrscheinlich nicht schneller ist als der von der Datenbank.

Zusammengefasst: Wenn Ihre Einfüge-/Aktualisierungsvorgänge Ihre Abfragen nicht wesentlich überschreiten, können Sie die Ansichten für Ihre unterschiedlichen Zugriffsmöglichkeiten auf Ihre Daten definieren.

Verwandte Themen