4

データベース内の階層データを表すためのいくつかの優れたオプションがあるようですが、最も一般的なのは、ツリートラバーサルアルゴリズムのようです。

私の場合におそらく機能するもう1つのオプションは、再帰的に実行することです。これには、親IDを保存してそこから移動することが含まれる可能性がありますが、これにも何らかの方向性が必要です。

現在、接続のチャートで特徴付けることができるアイテムのセットがあるという問題がありますが、ルートがなく、必ずしも開始点ではありません。たとえば、アイテムがループして、順序が要素ごとの要素のみであり、完全ではない場合があります。順序が「親」であるか「子」であるかは、いわば、どちらの方向から開始するかによって異なります。
さらに、各接続はいくつかのプロパティによって特徴付けられる必要があるため、接続は何らかの方法で識別可能である必要があります。
例

もう1つは、Accessに制限されていることです。つまり、SQLの再帰性や関数を使用せずに、標準のSQLコマンドにかなり制限されています。
たとえば、オンザフライで左/右トラバーサルツリーに変換するSQLの多くのアルゴリズムは、AccessSQLでは機能しません。
私は、VBAにもあまり依存せずにこれを解決することに大きな関心を持っています。

パフォーマンスに関しては、要素のプロパティとその接続に関するクエリには数十の要素が含まれる可能性がありますが、5000アイテム未満になると予想しています。データベースは、最初は10人未満のユーザーが同時に使用しますが、これらがうまく機能すれば、ここでは急速に拡張される傾向があります。

では、この構成をどのように実装しますか?

4

1 に答える 1

1

私はJoeCelkoの入れ子集合アプローチを使用しました。適切な状況で非常にうまく機能します。これはそのような状況の1つではありません。

はるかに柔軟なアプローチであり、私が使用することをお勧めするのは、ビル・カーウィンがクロージャーテーブルと呼んでいるものです。

基本的な考え方は、可能なパスごとに1つのレコードがあるということです。Billは、ancestor_idとdescendant_idの2つのフィールドを提案しています。祖先/子孫のパラダイムが実際にあなたのケースに当てはまるかどうかは、あなたの図からは明らかではありません。

また、ノード間のホップ数に少なくとももう1つのフィールドを追加すると便利です。次の3つのフィールドを持つテーブルを作成することにより、Billの方法を適応させます。

  1. NodeA
  2. NodeB
  3. ホップ

ダイアグラムのサンプルデータは次のとおりです。

NodeA   NodeB  Hops
------  ------ ----
tog171  tog171  0
tog171  abb521  1
abb521  tog171  1
tog171  tog226  2
tog226  tog171  2
tog171  tog218  3
tog218  tog171  3

異なる色の線と実線と破線に意味的な意味がある場合は、その意味的な意味をキャプチャする追加のフィールドをテーブルに追加することもできます。

テーブルには多くのエントリが含まれることになりますが、柔軟性はほぼ無限です。そして、図を見ると、柔軟性が最大のニーズであるように見えます。

編集:0ホップのサンプルデータの最初の行は、実際にはPJEbyのブログ投稿で学んだテクニック です。SQLでツリーベースのクエリを実行する最も簡単な(?)方法です。これらのノードの目的は、ノードの挿入と削除を簡単にすることです。クロージャーテーブルの実装の詳細な概要については、このページを強くお勧めします。

PJ Ebyのページは、実際にはクロージャーテーブルに書き込むためのより良いリソースだと思いますが、Bill Karwinの回答には、テーブルからの読み取りの優れた例がいくつかあります。

于 2013-01-25T15:16:53.673 に答える