У меня есть объект, и мне нужно сохранить историю всех внесенных в него изменений. Как реализовать это с помощью neo4j?
Как реализовать ревизии с помощью neo4j?
Ответ 1
Как и в СУБД, это будет зависеть от требований вашего домена и запросов к данным.
Требуется ли вашему приложению регулярный доступ ко всем версиям объекта или, как правило, к самому последнему, с более старыми версиями, доступными через текущий? Примером этого могут быть страницы в Википедии. Например, предположим, что у нас есть страница, которая находится на версии 3. Мы могли бы затем моделировать это следующим образом:
(pages)-[:PAGE]->(V3)-[:PREV]->(V2)-[:PREV]->(V1)
^ ^
| |
category current
node version of page
Здесь можно увидеть только текущую версию, которая станет частью основной структуры, но вы можете позволить всем версиям сформировать часть этой структуры. В этом случае вы можете использовать свойства отношений для указания версии и иметь ссылки на все версии страницы из категории node:
(V1)
^
|
[:PAGE(v=1)]
|
(pages)-[:PAGE(v=2)]->(V2)
|
[:PAGE(v=3)]
|
v
(V3)
Здесь вы можете сразу перейти к определенной версии страницы, просто указав версию, в которой вы заинтересованы.
Третий вариант может заключаться в том, что вы хотите, чтобы все более старые версии были полностью отделены от основной структуры. Для этого вы можете использовать несколько узлов категории, один для (current_pages)
и другой для (old_pages)
. Поскольку каждая страница заменяется новой версией, она становится несвязанной с прежней категорией и вместо этого связана с последней. Это создало бы более "архивный" тип системы, в котором более старые версии могли даже быть перемещены в отдельный экземпляр базы данных.
Итак, у вас есть эти три варианта, плюс больше, о чем я не думал! Neo4j позволяет вам проявлять большую гибкость при таком дизайне, и нет абсолютно "правильного" ответа. Если ни одна из них не вдохновляет вас, сообщите немного больше информации о своем домене, чтобы ответ был более адаптирован для ваших нужд.
Cheers, Nige
Ответ 2
Вы также можете приблизиться к нему с другой стороны:
(pages)-[:VERSION]->(V1)-[:VERSION]->(V2)-[:VERSION]->(V3)
^ ^
| |
category current
node version of page
Преимущество : при создании новой версии вы просто добавляете ее в конце цепочки, не нужно "вставлять" ее между (страницей) и текущей версией.
Недостаток: вы не можете просто выбросить старые версии, если только вы не восстановите цепочку. Но это, вероятно, не частая операция.