私は最近多くの実験を行っていますが、私がやりたかったことの 1 つは、Neo4j と MongoDB という 2 つの一般的な NoSQL データベースを結合することです。単純に、それらが完全に補完し合っていると感じているからです。Neo4j のファースト クラスの市民であるリレーションは、まさに MongoDB に欠けているものですが、MongoDb を使用すると、ノード プロパティに大量のデータを入れなくて済みます。
そのため、Neo4j Java REST バインディングと MongoDB Java ドライバーを使用して、Java アプリケーションで 2 つを組み合わせようとしています。すべてのドメイン エンティティには、両方のデータベースに保存する一意の識別子があります。他のデータは MongoDB に保存され、エンティティ間の関係は Neo4J に保存されます。たとえば、両方のデータベースにはユーザー ID が含まれ、MongoDB にはプロファイル情報が含まれ、Neo4J には友情関係が含まれます。私が作成したカスタム データ アクセス レイヤーを使用すると、これはまさに希望どおりに機能します。そしてそれは速いです。
しかし... ユーザーを作成したいときは、Neo4j でノードを作成し、MongoDB でドキュメントを作成する必要があります。Neo4j はトランザクション対応で、MongoDB はトランザクション対応でないことを除けば、必ずしも問題ではありません。両方がトランザクションの場合、いずれかが失敗したときに両方のトランザクションをロールバックします。しかし、MongoDB はトランザクション対応ではないため、これを行うことはできません。
ユーザーを作成するたびに、ノードとドキュメントの両方が作成されるか、どちらも作成されないことを確認するにはどうすればよいですか。一致するノードがない大量のドキュメントになってしまいたくありません。
その上、結合されたデータベース インタラクションを ACID に準拠させるだけでなく、スレッドセーフにすることも望んでいます。GraphDatabaseService と MongoClient / DB の両方がシングルトンから提供されます。
MongoDB で「トランザクション ドキュメント」を作成することについて何かを見つけましたが、そのアプローチは本当に好きではありません。私は、neo4j beginTx、tx.success、tx.failure、tx.finish セットアップのような、すてきでクリーンなものが欲しいです。理想的には、同じ try/catch/finally ブロックで実装できるものです。
トランザクショナルに見える CouchDB に切り替えるべきでしょうか?
編集:コメントに触発されてさらに調査した後、CouchDBも私の特定のニーズには適していないことに気付きました。明確にするために、Neo4j の部分は固定されています。ドキュメント ストア データベースは、Java ライブラリを持っている限りではありません。