Attualmente sto sperimentando molto, e una delle cose che volevo fare è combinare due popolari database NoSQL, vale a dire Neo4j e MongoDB. Semplicemente perché sento che si completano perfettamente a vicenda. I cittadini di prima classe in Neo4j, le relazioni, sono esattamente ciò che manca in MongoDB, mentre MongoDb mi consente di non inserire grandi quantità di dati nelle mie proprietà del nodo.Combinazione di Neo4J e MongoDB: coerenza
Quindi sto cercando di combinare i due in un'applicazione Java, utilizzando il binding REST Java Neo4j e il driver Java MongoDB. Tutte le mie entità di dominio hanno un identificatore univoco che memorizzo in entrambi i database. Gli altri dati sono memorizzati in MongoDB e le relazioni tra entità sono memorizzate in Neo4J. Ad esempio, entrambi i database contengono un ID utente, MongoDB contiene le informazioni del profilo e Neo4J contiene relazioni di amicizia. Con il livello di accesso ai dati personalizzato che ho scritto, funziona esattamente come lo voglio io. Ed è veloce.
MA ... Quando voglio creare un utente, ho bisogno di creare sia un nodo in Neo4j sia un documento in MongoDB. Non necessariamente un problema, tranne che Neo4j è transazionale e MongoDB no. Se entrambi fossero transazionali, ripristinerei entrambe le transazioni quando uno di questi fallisce. Ma dal momento che MongoDB non è transazionale, non posso farlo.
Come faccio a garantire che ogni volta che creo un utente, vengono creati sia un nodo che un documento o nessuno di entrambi. Non voglio finire con un sacco di documenti che non hanno un nodo corrispondente.
Oltre a ciò, non solo voglio che la mia interazione di database combinata sia compatibile con ACID, voglio anche che sia protetta da thread. Sia GraphDatabaseService che MongoClient/DB sono forniti da singleton.
Ho trovato qualcosa sulla creazione di "Documenti di transazione" in MongoDB, ma a me non piace questo approccio. Vorrei qualcosa di carino e pulito come il sistema neo4j startTx, tx.success, tx.failure, tx.finish. Idealmente, qualcosa che posso implementare nello stesso try/catch/finally block.
Devo forse passare a CouchDB, che sembra essere transazionale?
Modifica: Dopo qualche altra ricerca, scatenata da un commento, ho capito che CouchDB non è adatto alle mie esigenze specifiche. Per chiarire, la parte di Neo4j è scolpita nella pietra. Il database del Document Store non è lungo quanto ha una libreria Java.
Dove vedi le transazioni in CouchDb? Mongodb non ha transazioni (in base alla progettazione). Sembra che tu voglia non solo le transazioni, ma anche le transazioni distribuite. È necessario utilizzare un DB con transazioni o creare un processo che cancella i dati obsoleti/scollegati. – WiredPrairie
Il mio male. Non ero ben informato. Stavo leggendo un po 'su Couch DB ma dalle informazioni e bit, ho dedotto ingiustamente che avevano transazioni ACID. E sì, sto cercando transazioni distribuite. –