オブジェクトがあり、それに加えられたすべての変更の履歴を保持する必要があります。neo4jを使用してこれをどのように実装しますか?
2 に答える
RDBMSと同様に、ドメインとデータクエリの要件によって異なります。
アプリケーションでは、オブジェクトのすべてのバージョンに定期的にアクセスする必要がありますか、それとも通常は最新のバージョンにアクセスする必要がありますか?古いバージョンは現在のバージョンから入手できますか?この例として、ウィキペディアのページがあります。例として、バージョン3のページがあるとします。次に、これを次のようにモデル化できます。
(pages)-[:PAGE]->(V3)-[:PREV]->(V2)-[:PREV]->(V1)
^ ^
| |
category current
node version of page
ここでは、現在のバージョンのみがメイン構造の一部を形成していることがわかりますが、すべてのバージョンがその構造の一部を形成できるようにすることができます。この場合、リレーションシッププロパティを使用してバージョンを示し、すべてのページバージョンをカテゴリノードからリンクさせることができます。
(V1)
^
|
[:PAGE(v=1)]
|
(pages)-[:PAGE(v=2)]->(V2)
|
[:PAGE(v=3)]
|
v
(V3)
ここでは、関心のあるバージョンを指定するだけで、ページの特定のバージョンにすぐに移動できます。
3番目のオプションは、すべての古いバージョンをメイン構造から完全に分離することです。このために、複数のカテゴリノードを使用できます。1つはに(current_pages)
、もう1つはに使用できます(old_pages)
。各ページは新しいバージョンに置き換えられるため、前者のカテゴリからリンクが解除され、代わりに後者にリンクされます。これにより、より「アーカイブ」タイプのシステムが形成され、古いバージョンを別のデータベースインスタンスに移動することもできます。
したがって、これらの3つのオプションに加えて、私が考えていなかったオプションがあります。Neo4jを使用すると、この種の設計に大きな柔軟性がもたらされ、「正しい」答えはまったくありません。ただし、これらのいずれにも影響がない場合は、ドメインに関するもう少し情報を投稿して、ニーズに合わせて回答を調整できるようにしてください。
乾杯、ニゲ
反対側からアプローチすることもできます。
(pages)-[:VERSION]->(V1)-[:VERSION]->(V2)-[:VERSION]->(V3)
^ ^
| |
category current
node version of page
利点:新しいバージョンを作成するときは、チェーンの最後に追加するだけで、(ページ)と現在のバージョンの間に「挿入」する必要はありません。
欠点:チェーンを再構築しない限り、古いバージョンを破棄することはできません。しかし、これはおそらく頻繁な操作ではありません。