35 votes

SQL optimisé pour les structures d'arbres

Comment voulez-vous obtenir de l'arbre structuré de données à partir d'une base de données avec le meilleur rendement? Par exemple, disons que vous avez un dossier de hiérarchie dans une base de données. Lorsque le dossier de la base de données-ligne a ID, Nom et ParentID colonnes.

Souhaitez-vous utiliser un algorithme spécial pour obtenir toutes les données à la fois, réduisant la quantité de la base de données des appels et des processus dans le code?

Ou utilisez-vous faire de nombreux appels à la base de données et de tri d'obtenir la structure de la base de données directement?

Peut-être il y a différentes réponses basées sur la quantité de x de la base de données de lignes, de hiérarchie, de la profondeur ou quoi?

Edit: j'utilise Microsoft SQL Server, mais des réponses à partir d'autres points de vue sont intéressants aussi.

16voto

Ned Batchelder Points 128913

Cela dépend vraiment de la façon dont vous allez accéder à l'arbre.

Une technique intelligente est de donner à chaque nœud un id de chaîne, où l'id du parent est une sous-chaîne prévisible de l'enfant. Par exemple, le parent pourrait être '01', et les enfants seraient '0100', '0101', '0102', etc. De cette façon, vous pouvez sélectionner un sous-arbre entier à partir de la base de données à la fois avec:

Étant donné que le critère est une sous-chaîne initiale, un index sur la colonne d'ID accélérerait la requête.

15voto

Bernard Points 729

De toutes les façons de stocker un arbre dans un SGBDR les plus courantes sont les listes d'adjacence et imbriqués de jeux. Imbriquée jeux sont optimisés pour les lectures et peut récupérer un arbre entier dans une seule requête. Les listes d'adjacence sont optimisés pour l'écrit et peuvent être ajoutés à une requête simple.

La contiguïté des listes de chaque nœud a, colonne fait référence au nœud parent ou l'enfant du nœud (d'autres liens sont possibles). L'aide que vous pouvez construire la hiérarchie basée sur les relations parent-enfant. Malheureusement, sauf si vous limitez votre arbre de profondeur vous ne pouvez pas tirer la chose entière dans une seule requête et de la lecture, il est généralement plus lent que de le mettre à jour.

Avec l'ensemble imbriqué modèle l'inverse est vrai, la lecture est rapide et facile, mais les mises à jour deviennent complexes parce que vous devez maintenir le système de numérotation. L'ensemble imbriqué modèle de code à la fois la filiation et l'ordre de tri par l'énumération de tous les nœuds à l'aide d'une précommande en fonction d'un système de numérotation.

J'ai utilisé l'ensemble imbriqué de modèle et s'il est complexe pour lire l'optimisation d'un grand hiérarchie, il en vaut la peine. Une fois que vous faites quelques exercices dans le dessin de l'arbre et de la numérotation des nœuds, vous devriez obtenir le blocage de celui-ci.

Mes recherches sur cette méthode commencé à cet article: la Gestion Hiérarchique des Données dans MySQL.

13voto

Mladen Prajdic Points 10337

examiner le modèle de hiérarchie des ensembles nichés. c'est assez cool et utile.

4voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X