ホームページ >バックエンド開発 >PHPチュートリアル >階層データベース内のすべての子サイトを効率的に取得するにはどうすればよいですか?

階層データベース内のすべての子サイトを効率的に取得するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-28 14:43:11895ブラウズ

How to Efficiently Retrieve All Child Sites in a Hierarchical Database?

階層的な親子関係を効果的に実現する

モデルを理解する

指定したテーブル構造は階層関係を表していますsite_Id フィールドとparent_Id フィールドを通じて。テーブルの各行はサイトに対応し、parent_Id は親サイトの ID を参照します。目標は、指定されたサイト ID のすべての子を効率的に取得することです。

現在のメソッドの制限

現在のアプローチでは、ループ内に複数のクエリが含まれているため、非効率的になる可能性があります。 。これを最適化するために、代替ソリューションを検討してみましょう。

PostgreSQL を使用した再帰クエリ

PostgreSQL などの再帰クエリをサポートするデータベースを使用するオプションがある場合は、再帰的な CTE (共通テーブル式) を使用して、単一のクエリで階層を横断できます。例:

WITH RECURSIVE ChildSites AS (
  SELECT
    site_Id,
    parent_Id
  FROM
    site
  WHERE
    parent_Id = <input_site_id>
  UNION ALL
  SELECT
    s.site_Id,
    s.parent_Id
  FROM
    site AS s
  JOIN
    ChildSites AS cs ON s.parent_Id = cs.site_Id
)
SELECT
  *
FROM
  ChildSites;

最適化されたデータ モデル

データ モデルを変更できる場合は、次のような階層データ専用に設計されたデータ モデルの採用を検討してください。 🎜>

  • クロージャ テーブル: 推移的を格納しますクロージャ、祖先と子孫のクエリを最適化します。
  • ネストされたセット: 階層をネストされた間隔として表し、効率的な範囲クエリを可能にします。
  • パス列挙: 各ノードに一意のパスを割り当て、効率的なサブツリーを可能にします

ルート ID の保存

または、テーブルに root_Id 列を追加して、各サイトの最上位の祖先を識別することもできます。これにより、単一のクエリを使用してツリー全体を効率的に取得できます:

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。