2

次の方法で関連付けられているレコードを含むテーブルがあります。

親、子、孫。

クエリを実行して次のことを実行できるようにしたいと考えています。

  1. 特定のレコードの子孫であるすべてのレコードを取得する
  2. 特定のレコードの直接の子であるすべてのレコードを取得します (つまり、直接の子のみ)
  3. 特定のレコードの孫であるすべてのレコードを取得する (つまり、孫のみ)
  4. レコードの祖父母を取得する
  5. レコードの親を取得する
  6. すべてのレコード (およびその子と孫) を取得します

このクエリがソートされた方法でデータを返すようにしたいので、構造化ドキュメント (クエリ結果からの XML など) を作成できます。「ソート」とは、結果セットが親 THEN 子、THEN 孫によって「グループ化」されていることを意味します

このような単純なテーブルを設計しました (PSEUDO CODE):

CREATE TABLE family_tree {id integer
                    , parent_id integer
                    , child_id integer
                    , fname varchar(16)
                    , lname varchar(32) };

いくつか質問があります:

  1. (私が実行したいクエリ [(1)-(6)] を念頭に置いて) これが最善 (つまり、使用できる最も効率的なテーブル構造ですか?) です。いいえの場合、何ですか?

  2. 上記の (1) ~ (6) のクエリを実行するための ANSI SQL ステートメントの作成を手伝ってくれる人はいますか?

4

2 に答える 2

2

これに関するサイトポイントのチュートリアルを確認してください。

  • データ (id、parent_id) を格納する再帰的な方法により、特定のノードの直接の子孫を取得できます。
  • 順序付けされたツリー トラバーサル メソッドを使用すると、特定のノードのブランチ全体を取得できます。

したがって、id,parent_id,left,right列を持つことが最善の策です。そのチュートリアルにはコード全体が含まれていますが、SQL クエリは十分に明確なはずです。

チュートリアルで提供されているものからすべてのクエリを導出できるはずです。

于 2009-09-28T10:11:48.933 に答える
0

あなたはすでにエイマンタスの答えを受け入れているようです

「したがって、id、parent_id、left、right列を持つことが最善の策です。」

引用されたリンク(イタリック鉱山)から次の引用を明示的に指摘したいと思います。

「ノードの追加

ツリーにノードを追加するにはどうすればよいですか?2つのアプローチがあります。テーブルに親列を保持し、rebuild_tree()関数を再実行するだけです。これは単純ですが、それほど洗練された関数ではありません。または、新しいノードの右側にあるすべてのノードの左右の値を更新できます。「」

于 2009-09-28T16:27:05.867 に答える