Obecnie bardzo dużo eksperymentuję, a jedną z rzeczy, które chciałem zrobić, jest połączenie dwóch popularnych baz danych NoSQL, a mianowicie Neo4j i MongoDB. Po prostu dlatego, że czuję, że doskonale się uzupełniają. Pierwszorzędni obywatele w Neo4j, relacje, są dokładnie tym, czego brakuje w MongoDB, podczas gdy MongoDb pozwala mi nie umieszczać dużych ilości danych w moich właściwościach węzła.Łączenie Neo4J i MongoDB: Konsystencja
Próbuję połączyć te dwie aplikacje w języku Java, używając powiązania REST Java Neo4j i sterownika Java w MongoDB. Wszystkie moje domeny mają niepowtarzalny identyfikator, który przechowuję w obu bazach danych. Pozostałe dane są przechowywane w MongoDB, a relacje między nimi są przechowywane w Neo4J. Na przykład obie bazy zawierają identyfikator użytkownika, MongoDB zawiera informacje o profilu, a Neo4J zawiera relacje przyjaźni. Z niestandardową warstwą dostępu do danych, którą napisałem, działa dokładnie tak, jak tego chcę. I jest szybki.
ALE ... Kiedy chcę utworzyć użytkownika, muszę utworzyć zarówno węzeł w Neo4j, jak i dokument w MongoDB. Niekoniecznie problem, z wyjątkiem tego, że Neo4j jest transakcyjny, a MongoDB nie. Gdyby obie transakcje były transakcyjne, po prostu wycofywałbym obie transakcje, gdy jedna z nich zawiedzie. Ale ponieważ MongoDB nie jest transakcyjne, nie mogę tego zrobić.
W jaki sposób zapewnić, że ilekroć utworzę użytkownika, zarówno węzeł, jak i dokument zostaną utworzone, lub żaden z nich. Nie chcę skończyć z grupą dokumentów, które nie mają pasującego węzła.
Co więcej, nie tylko chcę, aby moja połączona interakcja z bazą danych była zgodna z ACID, ale chcę, aby była bezpieczna dla wątków. Zarówno usługa GraphDatabaseService, jak i MongoClient/DB są dostarczane z wersji singleton.
Znalazłem coś na temat tworzenia "Dokumentów transakcyjnych" w MongoDB, ale naprawdę nie podoba mi się to podejście. Chciałbym czegoś ładnego i czystego, jak konfiguracja neo4j beginTx, tx.success, tx.failure, tx.finish. Idealnie, coś, co mogę zaimplementować w tym samym bloku try/catch/finally.
Czy powinienem zamienić się na CouchDB, który wydaje się być transakcyjny?
Edit: Po kilku dalszych badań, wywołał za komentarz, zdałem sobie sprawę, że CouchDB nie nadaje się również do moich potrzeb. Aby wyjaśnić, część Neo4j jest osadzona w kamieniu. Baza danych magazynu dokumentów nie jest tak długa, jak ma bibliotekę Java.
Gdzie widzisz transakcje w CouchDb? Mongodb nie ma transakcji (według projektu). Wygląda na to, że chcesz nie tylko transakcji, ale także transakcji rozproszonych. Musisz użyć bazy danych z transakcjami lub zbudować proces, który czyści nieaktualne/odłączone dane. – WiredPrairie
Moja zła. Nie byłem dobrze poinformowany. Czytałem trochę o Couch DB, ale z fragmentów informacji błędnie potrąciłem, że mieli transakcje ACID. I tak, szukam transakcji rozproszonych. –