Maison > développement back-end > tutoriel php > Comment récupérer efficacement tous les sites enfants dans une base de données hiérarchique ?

Comment récupérer efficacement tous les sites enfants dans une base de données hiérarchique ?

Mary-Kate Olsen
Libérer: 2024-11-28 14:43:11
original
974 Les gens l'ont consulté

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

Réaliser efficacement une relation hiérarchique parent/enfant

Comprendre le modèle

La structure de table que vous avez fournie représente une relation hiérarchique via les champs site_Id et parent_Id. Chaque ligne du tableau correspond à un site, parent_Id faisant référence à l'ID de son site parent. L'objectif est de récupérer efficacement tous les enfants d'un ID de site donné.

Limitations de la méthode actuelle

Votre approche actuelle implique plusieurs requêtes dans une boucle, ce qui peut être inefficace . Pour optimiser cela, explorons des solutions alternatives.

Requêtes récursives avec PostgreSQL

Si vous avez la possibilité d'utiliser une base de données prenant en charge les requêtes récursives, telle que PostgreSQL, vous peut utiliser un CTE (Common Table Expression) récursif pour parcourir la hiérarchie en une seule requête. Par exemple :

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;
Copier après la connexion

Modèles de données optimisés

Si vous pouvez modifier le modèle de données, envisagez d'utiliser un modèle de données spécifiquement conçu pour les données hiérarchiques, tel que :

  • Table de fermeture : Stocke la fermeture transitive, optimisant les requêtes sur les ancêtres et descendants.
  • Ensembles imbriqués : Représente la hiérarchie sous forme d'intervalles imbriqués, permettant des requêtes de plage efficaces.
  • Énumération du chemin : Attribue un chemin unique à chaque nœud, permettant des requêtes de sous-arbres efficaces.

Stockage de la racine ID

Vous pouvez également ajouter une colonne root_Id au tableau pour identifier l'ancêtre le plus élevé de chaque site. Cela permet une récupération efficace d'arbres entiers à l'aide d'une seule requête :

SELECT
  *
FROM
  site
WHERE
  root_Id = <input_root_id>;
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal