Frage

Lassen Sie uns sagen, ich bin ein Log-Analyse-Anwendung zu schreiben. Das Haupt-Domain-Objekt wäre ein LogEntry sein. In Ergänzung. Benutzer der Anwendung eine LogTopic definieren, welche Eingaben sie interessiert sind log beschreibt. Da die Anwendung sie fügt es zu CouchDB erhält Log-Einträge, und prüft sie auch gegen alle LogTopics im System zu sehen, ob sie die Kriterien in dem Thema entsprechen . Ist dies der Fall, dann sollte das System festhalten, dass der Eintrag mit dem Thema übereinstimmt. Somit ist es eine viele-zu-viele-Beziehung zwischen LogEntries und LogTopics.

Wenn ich dies in einem RDBMS wurde Speicherung Ich möchte etwas tun:

CREATE TABLE Entry (
 id int,
 ...
)

CREATE TABLE Topic (
 id int,
 ...
)

CREATE TABLE TopicEntryMap (
 entry_id int,
 topic_id int
)

CouchDB verwenden Ich versuchte zunächst nur zwei Dokumententypen aufweisen. Ich hätte gerne ein LogEntry Typ haben, auf der Suche etwas wie folgt aus:

{
  'type': 'LogEntry',
  'severity': 'DEBUG',
  ...
}

und ich würde einen LogTopic Typ haben, auf der Suche etwas wie folgt aus:

{
  'type': 'LogTopic',
  'matching_entries': ['log_entry_1','log_entry_12','log_entry_34',....],
  ...
}

Sie sehen, dass ich die Beziehung darstellen, indem ein matching_entries Feld in jedem LogTopic Dokumente anhand eines Verzeichnisses mit LogEntry Dokument-IDs zu speichern. Dies funktioniert gut, bis zu einem Punkt, aber ich habe Probleme, wenn mehrere Clients beide versuchen werden einen passenden Eintrag zu einem Thema hinzuzufügen. Beide versuchen, optimistisch Updates und ausfällt. Die Lösung, die ich jetzt bin mit ist im Wesentlichen des RDBMS Ansatz zu reproduzieren, und fügen Sie eine dritte Dokumenttyp, so etwas wie:

{
  'type':'LogTopicToLogEntryMap',
  'topic_id':'topic_12',
  'entry_id':'entry_15'
}

Das funktioniert, und wird über die gleichzeitige Update, um Probleme, aber ich habe zwei Vorbehalte:

  1. Ich mache mir Sorgen, dass ich mit dieser einfach Ansatz, weil es ist, was ich tun würde in eine relationale DB. Ich frage mich, ob es ein CouchDB-like (relaxful?) Lösung.
  2. Meine Ansichten kann nicht mehr Abrufen alle Einträge für eine bestimmte Thema in einem Aufruf. Meine Ich vorherige Lösung erlaubt, dass (wenn die include_docs Parameter verwendet wird).

Wer eine bessere Lösung für mich? Würde es helfen, wenn ich auch die Ansichten gepostet ich verwende?

War es hilfreich?

Lösung

Ihr Ansatz ist in Ordnung. CouchDB Mit bedeutet nicht, werden Sie nur relationale Modellierung verlassen. Sie müssen müssen zwei Abfragen laufen, aber das ist, weil dies ein „Join“ ist. SQL-Abfragen mit Verknüpfungen sind auch langsam, aber die SQL-Syntax können Sie die Abfrage in einer Anweisung auszudrücken.

In meinen wenigen Monaten Erfahrung mit CouchDB das ist, was ich entdeckt habe:

  1. Kein Schema, so die Gestaltung der Anwendungsmodelle ist schnell und flexibel
  2. CRUD ist es, so die Entwicklung Ihrer Anwendung schnell und flexibel ist
  3. Auf Wiedersehen SQL-Injection
  4. Was für eine SQL beitreten würde dauert ein wenig mehr Arbeit in CouchDB

Je nach Bedarf Ich habe festgestellt, dass couchdb-lucene für den Aufbau komplexe Abfragen auch nützlich ist.

Andere Tipps

I Cross-Gepostet diese Frage zu dem couchdb Benutzer-Mailingliste und Nathan Stott < a href = "http://markmail.org/message/vsvwyz4rccc33jox" rel = "noreferrer"> zeigte mir ein sehr hilfreich Blog-Post von Christopher Lenz

Ich würde versuchen, die Beziehung einrichten, so dass LogEntrys wissen, zu dem LogTopics sie gehören. Auf diese Weise wird eine LogEntry Einfügen nicht Konflikte wie die LogTopics produzieren wird nicht geändert werden müssen.

Dann wird eine einfache Map-Funktion würde die LogEntry einmal für jeden LogTopic emittieren sie gehört, im Wesentlichen Ihre TopicEntryMap on the fly Aufbau:

"map": function (doc) {
    doc.topics.map(function (topic) {
        emit(topic, doc);
    });
}

Auf diese Weise mit einem ?key=<topic> Argument der Ansicht, die Abfrage erhalten Sie alle Einträge, die zu einem Thema gehören.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top