2013-05-07 10 views
6

Ich experimentiere viel in diesen Tagen, und eines der Dinge, die ich tun wollte, ist die Kombination zweier beliebter NoSQL-Datenbanken, nämlich Neo4j und MongoDB. Einfach weil ich fühle, dass sie sich perfekt ergänzen. Die erstklassigen Bürger in Neo4j, die Relationen, sind genau das, was in MongoDB fehlt, während MongoDb mir erlaubt, keine großen Datenmengen in meinen Knoteneigenschaften zu speichern.Kombination von Neo4J und MongoDB: Konsistenz

Also versuche ich die beiden in einer Java-Anwendung zu kombinieren, mit der Neo4j Java REST-Bindung und dem MongoDB Java-Treiber. Alle meine Domain-Entitäten haben eine eindeutige Kennung, die ich in beiden Datenbanken hinterlasse. Die anderen Daten werden in MongoDB gespeichert und die Beziehungen zwischen Entitäten werden in Neo4J gespeichert. Zum Beispiel enthalten beide Datenbanken eine Benutzer-ID, MongoDB enthält die Profilinformationen und Neo4J enthält Freundschaftsbeziehungen. Mit der benutzerdefinierten Datenzugriffsschicht, die ich geschrieben habe, funktioniert das genau so, wie ich es möchte. Und es ist schnell.

ABER ... Wenn ich einen Benutzer erstellen möchte, muss ich sowohl einen Knoten in Neo4j und ein Dokument in MongoDB erstellen. Nicht unbedingt ein Problem, außer dass Neo4j transaktional ist und MongoDB nicht. Wenn beide transaktional wären, würde ich beide Transaktionen einfach rückgängig machen, wenn einer von ihnen fehlschlägt. Aber da MongoDB nicht transaktional ist, kann ich das nicht tun.

Wie stelle ich sicher, dass bei der Erstellung eines Benutzers entweder ein Knoten und ein Dokument erstellt werden oder keines von beiden. Ich möchte nicht mit einer Reihe von Dokumenten enden, die keinen passenden Knoten haben.

Darüber hinaus möchte ich nicht nur, dass meine kombinierte Datenbankinteraktion ACID-kompatibel ist, ich möchte auch, dass es threadsicher ist. Sowohl der GraphDatabaseService als auch der MongoClient/DB werden von Singletons bereitgestellt.

Ich habe etwas über das Erstellen von "Transaktionsdokumenten" in MongoDB gefunden, aber ich mag diesen Ansatz wirklich nicht. Ich hätte gerne etwas schönes und sauberes wie das neo4j beginTx, tx.success, tx.failure, tx.finish Setup. Idealerweise kann ich etwas im selben try/catch/finally Block implementieren.

Sollte ich vielleicht zu CouchDB wechseln, die scheinbar transaktional ist?

Bearbeiten: Nach ein paar weiteren Recherchen, ausgelöst durch einen Kommentar, kam ich zu der Erkenntnis, dass CouchDB auch nicht für meine spezifischen Bedürfnisse geeignet ist. Zur Klarstellung ist der Neo4j-Teil in Stein gemeißelt. Die Document Store-Datenbank ist nicht so lang wie eine Java-Bibliothek.

+0

Wo sehen Sie Transaktionen in CouchDb? Mongodb hat keine Transaktionen (per Design). Es scheint, als ob Sie nicht nur Transaktionen, sondern möglicherweise auch verteilte Transaktionen wünschen. Sie müssen einen DB mit Transaktionen verwenden oder einen Prozess erstellen, der veraltete/nicht verbundene Daten bereinigt. – WiredPrairie

+0

Mein schlechtes. Ich war nicht gut informiert. Ich habe ein wenig über Couch DB gelesen, aber aus den kleinen Teilen der Informationen habe ich zu Unrecht ausgesagt, dass sie ACID-Transaktionen hatten. Und ja, ich suche nach verteilten Transaktionen. –

Antwort

11

Pieter-Jan,

, wenn Sie in der Lage sind 2.0 verwenden Neo4j Sie ein Schema-Index-Provider implementieren kann (was einfach ist), die in MongoDB Ihre Dokumente transaktions erstellt.

Da Neo4j seine Indexanbieter transaktional macht (seit Anfang), haben wir das mit Lucene gemacht und es gibt auch einen für Redis (muss aktualisiert werden). Aber es ist viel einfacher mit Neo4j 2.0, wenn Sie möchten, können Sie meine Implementierung für MapDB überprüfen. (https://github.com/jexp/neo4j-mapdb-index)

+0

Schön! Fast fühlbar, dass du eine andere Technologie vorgeschlagen hast. ;-) – tstorms

+1

A-W-E-S-O-M-E! Deshalb mag ich Neo4j so sehr. Wenn Sie es in der Dokumentation nicht finden können, gibt es immer einen cleveren Kerl, der eine Lösung hat. Vielen Dank! –

+0

Ok, also ich habe daran gearbeitet, und ich möchte nur überprüfen, ob ich damit in die richtige Richtung gehe. Anstatt einen Knoten tatsächlich zu indexieren, stelle ich nur sicher, dass bei der Indexierung eines Knotens tatsächlich ein Dokument in der Sammlung erstellt wird. Ich habe auch die Eindeutigkeit erzwungen, so dass Sie nicht zwei Dokumente für einen einzelnen Knoten haben können. Jetzt, um Informationen zu diesen Dokumenten hinzuzufügen, kann ich einfach eine Mongo-Abfrage verwenden, um das Dokument zu finden und es zu bearbeiten, richtig? –

2

Obwohl ich ein großer Fan von beiden Technologien bin, denke ich, eine bessere Option für Sie könnte OrientDB sein. Es ist ein Graph (als Neo4) und Dokument (als MongoDB) Datenbank in einem und unterstützt ACID-Transaktionen. Klingt wie eine perfekte Ergänzung für Ihre Bedürfnisse.

+2

Der Neo4j Teil ist in Stein gemeißelt Ich habe Angst aus verschiedenen Gründen, die einige über meine "Rechtsprechung" hinaus beinhalten. Aber ich habe auch einige Zweifel an OrientDB. Es scheint, als würden sie versuchen, in allem gut zu sein. Und leider muss ich noch ein Produkt finden, das das versucht und erfolgreich ist. Ich könnte mich hier irren, aber irgendwie bezweifle ich, dass OrientDB ein Produkt liefern kann, das sowohl in der Graph DB-Klasse als auch in der Document-Store-Klasse mit den besten Schülern mithalten kann. Aber natürlich bin ich nur zynisch ... Und wie du, bin ich auch ein bisschen ein Fan: D –