Question

J’estime qu’il s’agit probablement d’un problème courant, mais ma recherche sur Google ne me permet pas de trouver une solution aussi spécifique à mon problème.

J'ai une liste d'organisations (table) dans ma base de données et je dois pouvoir exécuter des requêtes en fonction de leur hiérarchie. Par exemple, si vous interrogez la plus haute organisation, je voudrais renvoyer les identifiants de toutes les organisations répertoriées sous cette organisation. De plus, si j'interroge une organisation de taille moyenne sur une organisation, je souhaite uniquement que l'identifiant d'organisation soit répertorié sous cette organisation.

Quel est le meilleur moyen de a) configurer le schéma de base de données et b) d'interroger? Je souhaite seulement envoyer l’identificateur d’organisation le plus élevé, puis l’identifier sous cette organisation.

Je pense que cela a du sens, mais je peux clarifier si nécessaire.

Était-ce utile?

La solution

Un moyen simple consiste à stocker la parenté de l'organisation dans un champ de texte, tel que:

VENTE-EUROPE-NORD

Pour rechercher chaque organisation de vente, vous pouvez interroger sur SALES-%. Pour chaque organisation de vente européenne, requête sur SALES-EUROPE -%.

Si vous renommez une organisation, veillez également à mettre à jour ses organisations enfants.

Cela reste simple, sans récursivité, au prix d'une certaine souplesse.

Autres conseils

Comme promis dans mon commentaire, j'ai découvert un article sur la manière de stocker des hiérarchies dans une base de données permettant de récupérer des sous-arbres arbitraires à temps constant. Je pense que cela répondra mieux à vos besoins que la réponse actuellement identifiée comme acceptée, à la fois en termes de facilité d'utilisation et de rapidité d'accès. Je pourrais jurer que j’ai vu ce même concept sur wikipedia à l’origine, mais je ne le trouve pas pour le moment. Cela s'appelle apparemment une "traversée d'arborescence de pré-commande modifiée". L'essentiel est de numéroter chaque nœud de l'arbre deux fois, en effectuant une traversée en profondeur d'abord, une fois en descendant et une fois en remontant (c'est-à-dire lorsque vous déroulez la pile, dans une implémentation récursive). . Cela signifie que les enfants d'un nœud donné ont tous leurs numéros entre les deux numéros de ce nœud. Jetez un index sur ces colonnes et vous obtiendrez des recherches très rapides. Je suis sûr que c’est une explication épouvantable, lisez donc l’article, qui approfondit et inclut des images.

Le moyen le plus simple est d’avoir une colonne ParentID, qui est une clé étrangère à la colonne ID de la même table, NULL pour les nœuds racine. Mais cette méthode présente des inconvénients.

Les ensembles imbriqués constituent un moyen efficace de stocker des arbres. une base de données relationnelle.

Une organisation peut avoir un identifiant PK et une référence FK parent à l'identifiant. Ensuite, pour la requête, utilisez (si votre base de données les prend en charge) des requêtes récursives, également appelées expressions de table communes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top