データ モデリングの分野では、階層関係と親子関係を確立することが多くのアプリケーションにとって重要です。この記事では、特定のデータ モデルの制約内でこの目標を達成するための効果的かつ効率的な方法について詳しく説明します。
サイト情報と親子関係を保存するデータベース テーブルを考えてみましょう:
<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>
アルゴリズム:
このアプローチは、データベースのオーバーヘッドを発生させずに効率的な階層横断を実現し、中程度のサイズのツリーに適しています。
以上が親子関係を持つ階層データベース テーブル内のすべての子ノードを効率的に取得するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。