В последнее время я много экспериментирую, и одна из вещей, которые я хотел сделать, — это объединить две популярные базы данных NoSQL, а именно Neo4j и MongoDB. Просто потому, что я чувствую, что они идеально дополняют друг друга. Граждане первого класса в Neo4j, отношения, — это именно то, чего не хватает в MongoDB, тогда как MongoDb позволяет мне не помещать большие объемы данных в свойства моего узла.
Поэтому я пытаюсь объединить их в приложении Java, используя привязку Neo4j Java REST и драйвер Java MongoDB. Все объекты моего домена имеют уникальный идентификатор, который я храню в обеих базах данных. Остальные данные хранятся в MongoDB, а отношения между сущностями хранятся в Neo4J. Например, обе базы данных содержат идентификатор пользователя, 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.