Quels sont les moyens connus pour stocker une structure arborescente dans un monde relationnel?
Il est le "mettre un FK à votre parent" méthode, c'est à dire chaque enregistrements points à celle du parent.
Ce qui est dur pour lire les actions, mais très facile à entretenir.
Et puis il y a une "structure de répertoire de la clé" méthode:
0001.0000.0000.0000 main branch 1
0001.0001.0000.0000 child of main branch one
etc
Qui est super facile à lire, mais difficile à maintenir.
Quelles sont les autres façons de faire et leurs inconvénients/professionnels de l'informatique?
- Nous sommes à l'aide de la méthode de référence pour le parent à l'aide de FK pour le stockage de données hiérarchiques et sont presque heureux. Pour charger beaucoup de données, nous faisons une requête XML et deserialise à des objets.
- À première vue, les structures en arbre et les Sgbdr sont horrible fit. Si je n'ai jamais vu un cas d'utilisation pour Stockage Structuré, c'est ça.
- +1 que "l'horrible crise" lien donne des exemples de comment faire à l'aide de 2 structures et certains ont suggéré la lecture.
- Voir stackoverflow.com/questions/846201/... pour les sous ensembles, les principaux schémas de nommage et d'autres approches à la pression des hiérarchies dans les relations.
- n'est-ce pas la deuxième façon j'ai montré ici?
- Le "meilleur" de la mise en œuvre dépend de la structure de données et lecture/écriture caractéristiques. Pour un quasi-complète de la communauté-mise à jour de la liste des options à envisager ce qui fonctionne le mieux pour vous: stackoverflow.com/questions/4048151
Vous devez vous connecter pour publier un commentaire.
Comme toujours: il n'y a pas de meilleure solution. Chaque solution fait des choses différentes, plus facile ou plus difficile. La bonne solution pour vous, dépend de l'opération pour laquelle vous effectuez la plupart.
Approche naïve avec les parents-id:
Pour:
facile à mettre en œuvre
facile à déplacer un grand sous-arbre à un autre parent
insert est pas cher
Champs nécessaires accessible directement en SQL
Contre:
de la récupération d'un arbre entier est récursive et donc cher
trouver tous les parents est trop cher ( SQL ne sais pas récurrences... )
Modifié Précommande Arbre Transversal ( économie d'une start- & end-point) :
Pour:
De la récupération d'un arbre entier est facile et bon marché
Trouver tous les parents n'est pas cher
Champs nécessaires accessible directement en SQL
Bonus: vous êtes économiser de l'ordre de childnodes dans son parentnode trop
Contre:
De l'enregistrement d'un chemin d'accès dans chaque Nœud:
Pour:
Trouver tous les parents n'est pas cher
De la récupération d'un ensemble de l'arbre est bon marché
L'insertion est pas cher
Contre:
Le déplacement d'un arbre entier est cher
Selon la façon dont vous enregistrez le chemin, vous ne serez pas en mesure de travailler avec elle directement en SQL, donc vous devez toujours chercher & analyser, si vous voulez le changer.
Je préfère l'un des deux derniers, en fonction de la façon dont souvent les modifications de données.
Voir aussi: http://media.pragprog.com/titles/bksqla/trees.pdf
Modifié Précommande Arbre Transversal
C'est une méthode qui utilise un non-récursive de la fonction (généralement d'une seule ligne de SQL) pour récupérer des les arbres à partir de la base de données, au prix d'être un peu plus délicat à mettre à jour.
**
L'article 2 de la Sitepoint article Le stockage des Données Hiérarchiques dans une Base de données pour plus de détails.
Modified Preorder Tree Traversal
est une belle façon de résoudre ce problème, dans le cas de ne pas modifier la structure de l'arbre fréquemment.Je dirais que le "moyen d'or" pour stocker une structure de données hiérarchique est d'utiliser une base de données hiérarchique. Comme, par exemple, HDB. C'est une base de données relationnelle qui gère les arbres assez bien. Si vous voulez quelque chose de plus puissant, LDAP pourrait le faire pour vous.
Une base de données SQL est mal adapté pour ce résumé de la topologie.
Je ne pense pas qu'il est difficile de construire une structure arborescente avec une base de données relationnelle.
Cependant, un objet de base de données orientée fonctionnerait beaucoup mieux pour ce but.
À l'aide d'un objet de base de données orientée:
Dans un orientée objet base de données, vous pouvez construire cette structure assez facilement.
Dans une base de données relationnelle, vous aurez à maintenir des touches de parent.
Essentiellement, lors de la construction de l'arborescence, vous devrez joindre à tous ces tableaux, ou vous pouvez parcourir à travers eux.