Question

Quels sont pour sauver les « meilleures pratiques » modèles composites dans une base de données relationnelle?

Nous avons été modifiés à l'aide Précommande Arbre Traversal. Ceci est très rapide pour construire l'arbre entier, mais très lent à insérer ou supprimer de nouveaux noeuds (toutes les valeurs à gauche et à droite doivent être ajustés). De plus, les enfants interrogeant d'un nœud est pas facile et très lent.

Une autre chose que nous avons remarqué que vous avez vraiment pour vous assurer que l'arbre ne soit pas en désordre. Vous avez besoin verrous de transaction, sinon les valeurs de gauche et de droite peuvent se corrompre, et la fixation d'un arbre droit corrompu gauche n'est pas une tâche facile.

Il ne fonctionne très bien, cependant, l'arbre Précommande modifié Traversal, mais je me demandais s'il existe de meilleures alternatives.

Était-ce utile?

La solution

Tout en trouvant tous les descendants d'une ligne avec MPTT est rapide, trouver tous les enfants peut être lent. Cependant, vous devriez être en mesure de résoudre ce problème en ajoutant un champ parent_id à votre table que les dossiers (oui, de manière redondante) 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 / suppression nécessite déjà des changements mondiaux, l'parent_id mise à jour n'est pas beaucoup plus pour payer. Vous pouvez également utiliser un champ level qui enregistre le niveau vertical de la ligne, bien que ce soit en fait plus susceptible de changer certains types de transformations (par exemple le déplacement d'un sous-arbre à un autre point dans l'arbre) .

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 X » et « Trouver les enfants de X. » La plupart des charges de travail impliquent beaucoup plus de lecture que l'écriture, donc généralement MPTT est globalement plus rapide - mais peut-être dans votre cas vous devez envisager de déplacer ( « retour ») pour relier à parent

?

Autres conseils

La meilleure façon de stocker des données hiérarchiques 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, disons côlons.

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