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.
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
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. –