ホームページ > データベース > mysql チュートリアル > 親子関係を持つ階層データベース テーブル内のすべての子ノードを効率的に取得するにはどうすればよいでしょうか?

親子関係を持つ階層データベース テーブル内のすべての子ノードを効率的に取得するにはどうすればよいでしょうか?

Susan Sarandon
リリース: 2025-01-13 18:11:43
オリジナル
496 人が閲覧しました

How Can We Efficiently Retrieve All Child Nodes in a Hierarchical Database Table with Parent-Child Relationships?

階層と親子関係: より効率的なアプローチ

データ モデリングの分野では、階層関係と親子関係を確立することが多くのアプリケーションにとって重要です。この記事では、特定のデータ モデルの制約内でこの目標を達成するための効果的かつ効率的な方法について詳しく説明します。

質問

サイト情報と親子関係を保存するデータベース テーブルを考えてみましょう:

<code class="language-sql">create table site
(
site_Id int(5),
parent_Id int(5),
site_desc varchar2(100)
);</code>
ログイン後にコピー

要件は、次のような階層を表す、指定されたサイト ID のすべての子ノードを取得することです:

<code>                    A
                   / \
                  B   C
                / | \ /\
               D  E F G H
              /\
             I  J</code>
ログイン後にコピー

入力: サイト B
出力: D、E、F、I、J

現在の方法

既存の方法には複数のネストされたクエリが含まれており、非効率である可能性があります。最適化されたソリューションを検討してみましょう。

データモデルの制約

指定されたデータ モデルでは、ルート ノードを除くすべてのノードに親ノードがあります。この制約により、効率的な階層検索に使用できるオプションが制限されます。

代替データモデル

隣接リスト モデルは特定のデータに対してはうまく機能しますが、深い階層を扱う場合は効率が低くなります。クロージャ テーブル、ネストされたセット、およびパス列挙モデルは、より効率的なソリューションを提供しますが、データ モデルの変更が必要ですが、この場合は不可能です。

実践的な解決策

データ モデルの制約を考慮して、変更された隣接リスト モデルを使用し、「root_id」列を追加することをお勧めします。

<code class="language-sql">create table site
(
site_Id int(5),
parent_Id int(5),
root_id int(5)
);</code>
ログイン後にコピー

各ノードの「root_id」列には、ツリー内の最上位の祖先ノードが格納されます。これにより、単一のクエリでツリー全体を取得できるようになります:

<code class="language-sql">SELECT * FROM site WHERE root_id = <root_id></code>
ログイン後にコピー

アルゴリズム:

  1. すべてのルート ノードを取得します。
  2. ルート ノードをトラバースします。
  3. ルート ノードごとに、「root_id」列を使用してすべての子ノードを取得します。
  4. メモリ内に階層を構築します。

このアプローチは、データベースのオーバーヘッドを発生させずに効率的な階層横断を実現し、中程度のサイズのツリーに適しています。

以上が親子関係を持つ階層データベース テーブル内のすべての子ノードを効率的に取得するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート