Enregistrement de motifs composites (données hiérarchique) dans la base de données
-
22-08-2019 - |
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.
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.