Подтвердить что ты не робот

Как реализовать ревизии с помощью neo4j?

У меня есть объект, и мне нужно сохранить историю всех внесенных в него изменений. Как реализовать это с помощью neo4j?

4b9b3361

Ответ 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
Преимущество

: при создании новой версии вы просто добавляете ее в конце цепочки, не нужно "вставлять" ее между (страницей) и текущей версией.

Недостаток: вы не можете просто выбросить старые версии, если только вы не восстановите цепочку. Но это, вероятно, не частая операция.