Quelles sont les options pour le stockage de données hiérarchiques dans une base de données relationnelle?

Bonne Aperçus

Généralement parlant, vous êtes prise d'une décision rapide entre les temps de lecture (par exemple, l'ensemble imbriqué) ou rapide le temps d'écriture (liste d'adjacence). Habituellement, vous vous retrouvez avec une combinaison des options ci-dessous qui correspondent le mieux à vos besoins. Voici quelques une lecture approfondie:

Options

Ceux que je suis au courant et caractéristiques générales:

  1. Liste D'Adjacence:
    • Colonnes: ID, ParentID
    • Facile à mettre en œuvre.
    • Pas cher nœud se déplace, des insertions et des suppressions.
    • Cher pour trouver le niveau, l'ascendance & descendants, chemin
    • Éviter de N+1 par l'intermédiaire d' Les Expressions De Table Communes dans les bases de données qui prennent en charge eux
  2. Ensemble Imbriqué (un.k.un Modifié En Précommande Arbre Transversal)
    • Colonnes: À Gauche, À Droite
    • Pas cher de l'ascendance, de descendance
    • Très cher O(n/2) se déplace, les insertions, les suppressions du fait de la volatilité de l'encodage
  3. Table De Bridge (un.k.un. Fermeture de la Table /w déclencheurs)
    • Utilise la table de jointure séparée avec: ancêtre, descendant, de la profondeur (en option)
    • Pas cher l'ascendance et de la descendance
    • Écrit coûts O(log n) (taille du sous-arbre) pour l'insertion, mises à jour, suppressions
    • Normalisé d'encodage: bon pour le SGBDR statistiques & planificateur de requête dans les jointures
    • Nécessite plusieurs lignes par nœud
  4. La Lignée De La Colonne (un.k.un. Chemin Matérialisé, Chemin De L'Énumération)
    • Colonne: la lignée (par exemple, /parent/enfant/petit enfant/etc...)
    • Pas cher descendants via le préfixe de la requête (par exemple,LEFT(lineage, #) = '/enumerated/path')
    • Écrit coûts O(log n) (taille du sous-arbre) pour l'insertion, mises à jour, suppressions
    • Non-relationnelles: s'appuie sur le Tableau de type de données ou chaîne sérialisée format
  5. Imbriqués Les Intervalles De
    • Comme ensemble imbriqué, mais avec de vrais/float/décimal de sorte que l'encodage n'est pas volatile (peu coûteux de déplacer/insérer/supprimer)
    • A vrai/float/représentation décimale/précision questions
    • Matrice de variantes de codage ajoute ancêtre de l'encodage (chemin matérialisé) pour le "libre", mais avec une trickiness de l'algèbre linéaire.
  6. Table À Plat
    • Une modification de la Liste d'Adjacence, qui ajoute un Niveau et le Rang (par exemple, la commande) colonne pour chaque enregistrement.
    • Pas cher pour itérer/paginer sur
    • Cher déplacer et de supprimer des
    • Bon Usage: fils de discussion - forum /blog de commentaires
  7. Plusieurs colonnes de lignage
    • Colonnes: une pour chaque lignée niveau, se réfère à tous les parents jusqu'à la racine, niveaux plus bas que le niveau de l'objet sont mis à NULL
    • Pas cher ascendants, descendants, niveau
    • Bon marché insérer, supprimer, déplacer des feuilles
    • Cher, insérer, supprimer, déplacer des nœuds internes
    • Dur de limite à la profondeur de la hiérarchie peut être

De La Base De Données Des Notes Spécifiques

MySQL

Oracle

PostgreSQL

SQL Server

  • Résumé général
  • 2008 offre HierarchyId type de données apparaît pour vous aider avec la Lignée de la Colonne d'approche et d'étendre la profondeur qui peut être représenté.
  • Selon slideshare.net/billkarwin/sql-antipatterns-strike-back de la page 77, Closure Tables sont supérieures à Adjacency List, Path Enumeration et Nested Sets en termes de facilité d'utilisation (et je devine aussi bien de la performance).
  • Je m'ennuie très simple version ici: une simple GOUTTE. Si votre hiérarchie a seulement quelques dozend éléments sérialisé arbre de id pourrait être la meilleure option.
  • la question est un wiki de la communauté, alors n'hésitez pas à avoir à elle. Ma pensée à cet égard, je tiens seulement à faire avec ces bases de données qui prennent en charge une sorte de blob structurants tels que XML stables avec un langage de requête comme XPATH. Sinon, je ne vois pas une bonne façon d'interrogation à côté de récupération, de désérialiser, et munge dans le code, pas SQL. Et si vous avez vraiment un problème où vous avez besoin d'un grand nombre de l'arbitraire des éléments, vous pourriez être mieux de l'aide d'un Noeud de base de données comme Neo4J, que j'ai utilisé et aimé, mais jamais pris jusqu'à la production.
  • Pour MS SQL Server: Combinaison de l'Id-ParentId et HierarchyId Approches Hiérarchiques de Données
  • Que MSDN lien "Synthèse Générale" n'affiche plus l'article. C'était en septembre 2008, édition de MSDN Magazine, que vous pouvez télécharger en tant que fichier CHM, ou à voir via le web archive: web.archive.org/web/20080913041559/http://msdn.microsoft.com:80/...