web-dev-qa-db-ja.com

NoSQLでツリー構造を表す方法

私はNoSQLに不慣れで、MEANスタック(Mongo ExpressJs AngularJs NodeJs)の個人プロジェクトで遊んでいます。データのノードを管理する種類のドキュメントエディターを構築しています。各ドキュメントは実際にはツリーです。

新しいツリーを作成するためのドキュメント用のCRUD APIと、特定のドキュメント内のノード用のCRUD APIがあります。

現在、ドキュメントはノードを含むすべてを保持するコレクションとして表されています。子の親関係はIDによって行われます。したがって、ノードはIDによるマップであり、各ノードには、どのノードが子であるかへの参照があります。ドキュメントからIDでノードを取得する方が簡単なため、この「フラット」アプローチを選択しました。

ノードとドキュメント間のリレーションテーブル、ノードと子ノード間のリレーションテーブルに慣れているので、ノードを更新するたびに「ノード」マップ全体を保存する必要があるのは少しおかしいです。

NoSQLでそのようなデータ型を表すより良い方法はありますか?

6
Vlad Nicula

MongoDBでツリー構造を表す場合、いくつかのオプションがあります。適用できる5つの「パターン」を次に示します(末尾の詳細へのリンク)。

  • Child Referencesパターンは、各ツリーノードをドキュメントに格納します。ドキュメントは、ツリーノードに加えて、ノードの子のIDを配列に格納します。
  • Parent Referencesパターンは、各ツリーノードをドキュメントに格納します。ツリーノードに加えて、ドキュメントにはノードの親のIDが格納されます。
  • Array of Ancestorsパターンは、各ツリーノードをドキュメントに格納します。ドキュメントは、ツリーノードに加えて、ノードの祖先またはパスのIDを配列に格納します。
  • マテリアライズドパスパターンは、各ツリーノードをドキュメントに格納します。ツリーノードに加えて、ドキュメントはノードの祖先またはパスのIDを文字列として保存します。
  • Nested Setsパターンは、各ツリーノードをドキュメントに格納します。ツリーノードに加えて、ドキュメントはノードの親のID、左側のフィールドにノードの最初のストップ、右側のフィールドに戻りストップを格納します。

MongoDBチュートリアルのこのチュートリアルでは、各パターンの長所と短所について説明します。 http://docs.mongodb.org/manual/tutorial/model-tree-structures/

11
Ger Hartnett

NoSQLの理念の1つは、現在のタスクに最適なタイプのデータベースを使用することです。 MongoDB以外のものを使用するオプションはありますか?

ドキュメント階層については、 Java Content Repository 標準のようなものを試すことができます。ほとんどの主要なCMシステムで実装されており、完全に準拠したリファレンス実装 Apache Jackrabbit もあります。

0
metacubed