Maison > base de données > tutoriel mysql > Comment pouvons-nous récupérer efficacement tous les nœuds enfants dans une table de base de données hiérarchique avec des relations parent-enfant ?

Comment pouvons-nous récupérer efficacement tous les nœuds enfants dans une table de base de données hiérarchique avec des relations parent-enfant ?

Susan Sarandon
Libérer: 2025-01-13 18:11:43
original
496 Les gens l'ont consulté

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

Hiérarchie et relations parents-enfants : une approche plus efficace

Dans le domaine de la modélisation des données, l'établissement de relations hiérarchiques et parent-enfant est crucial pour de nombreuses applications. Cet article explore une manière efficace et efficiente d'atteindre cet objectif dans les contraintes d'un modèle de données donné.

Question

Considérons une table de base de données qui stocke les informations du site et les relations parent-enfant :

<code class="language-sql">create table site
(
site_Id int(5),
parent_Id int(5),
site_desc varchar2(100)
);</code>
Copier après la connexion

L'exigence est de récupérer tous les nœuds enfants d'un ID de site donné, représentant une hiérarchie comme celle-ci :

<code>                    A
                   / \
                  B   C
                / | \ /\
               D  E F G H
              /\
             I  J</code>
Copier après la connexion

Entrée : Site B
Sortie : D, E, F, I, J

Méthode actuelle

Les méthodes existantes impliquent plusieurs requêtes imbriquées et peuvent être inefficaces. Explorons une solution optimisée.

Contraintes du modèle de données

Dans le modèle de données donné, chaque nœud a un nœud parent, à l'exception du nœud racine. Cette contrainte limite les options disponibles pour une récupération hiérarchique efficace.

Modèle de données alternatif

Bien que le modèle de liste de contiguïté fonctionne bien pour les données données, il est moins efficace lorsqu'il s'agit de hiérarchies profondes. Les tables de fermeture, les ensembles imbriqués et les modèles d'énumération de chemins fournissent des solutions plus efficaces, mais nécessitent des modifications du modèle de données, ce qui n'est pas possible dans ce cas.

Solutions pratiques

Compte tenu des contraintes du modèle de données, nous recommandons d'utiliser un modèle de liste de contiguïté modifié et d'ajouter une colonne "root_id" :

<code class="language-sql">create table site
(
site_Id int(5),
parent_Id int(5),
root_id int(5)
);</code>
Copier après la connexion

Pour chaque nœud, la colonne "root_id" stocke le nœud ancêtre le plus élevé dans son arborescence. Cela nous permet de récupérer l'intégralité de l'arbre avec une seule requête :

<code class="language-sql">SELECT * FROM site WHERE root_id = <root_id></code>
Copier après la connexion

Algorithme :

  1. Récupérez tous les nœuds racines.
  2. Traversez le nœud racine.
  3. Pour chaque nœud racine, récupérez tous les nœuds enfants à l'aide de la colonne "root_id".
  4. Construisez des hiérarchies en mémoire.

Cette approche permet un parcours hiérarchique efficace sans surcharge de base de données, ce qui la rend adaptée aux arbres de taille moyenne.

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