2009-03-29 14 views
8

Quelles sont les «meilleures pratiques» pour enregistrer des modèles composites dans une base de données relationnelle?Stockage de modèles composites (données hiérarchiques) dans la base de données

Nous avons utilisé Modified Preorder Tree Traversal. Ceci est très rapide pour construire l'arbre entier, mais très lent pour insérer ou supprimer de nouveaux nœuds (toutes les valeurs gauche et droite doivent être ajustées). L'interrogation des enfants d'un nœud n'est pas facile et très lente.

Une autre chose que nous avons remarquée est que vous devez vraiment vous assurer que l'arbre ne soit pas en désordre. Vous avez besoin de verrous de transaction, sinon les valeurs de gauche et de droite peuvent être corrompues, et la réparation d'un arbre de gauche n'est pas une tâche facile.

Cela fonctionne très bien, cependant, je me demandais s'il y avait de meilleures alternatives.

+0

Ir dépend un peu du type de requêtes utilisées le plus. –

Répondre

6

Alors que trouver tous les descendants d'une ligne avec MPTT est rapide, trouver tous les enfants peut être lent. Cependant, vous devriez pouvoir corriger cela en ajoutant un champ parent_id à votre table qui enregistre (oui, redondant) le parent de la ligne. Ensuite, la recherche devient:

SELECT * 
FROM tbl 
WHERE parent_id = z 

Oui, parent_id contient des informations redondantes, dénormaliser potentiellement votre table - mais étant donné que toute insertion/mise à jour/supprimer déjà nécessite des changements mondiaux, l'parent_id mise à jour n'est pas beaucoup supplémentaire payer. Vous pouvez également utiliser un champ level qui enregistre le niveau vertical de la ligne, bien que ce soit plus susceptibles de changer sous certains types de transformations (par exemple déplacer un sous-arbre vers un point différent dans l'arborescence).

La plaine ancienne représentation lien à parent (c.-à-juste avoir parent_id et pas left_pos ou right_pos), est bien sûr plus rapide des charges de travail d'insertion/mise à jour lourde, mais les seules questions qu'il peut répondre efficacement sont « Trouvez le parent de X "et" Trouver les enfants de X. " La plupart des charges de travail impliquent beaucoup plus de lecture que d'écriture, donc MPTT est généralement plus rapide dans l'ensemble - mais peut-être que dans votre cas vous devez envisager de déplacer ("back") vers link-to-parent?

0

La meilleure façon de stocker des données hiératiques dans une base de données que j'ai entendu est d'utiliser un attribut de chaîne où le contenu est la liste des parents séparés par, disons deux-points.