Quel serait le meilleur moyen d'implémenter une structure de données d'arborescence personnalisable (c'est-à-dire une structure arborescente avec un nombre inconnu de niveaux) dans une base de données?
Je l'ai déjà fait une fois avant d'utiliser une table avec une clé étrangère.
Quelles autres implémentations pourriez-vous voir et cette implémentation a-t-elle un sens?
Vous mentionnez la liste d’adjacence la plus couramment mise en œuvre: https://blogs.msdn.Microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets
Il existe également d'autres modèles, notamment des chemins matérialisés et des ensembles imbriqués: http://communities.bmc.com/communities/docs/DOC-9902
Joe Celko a écrit un livre sur ce sujet, qui constitue une bonne référence du point de vue général de SQL (il est mentionné dans le lien ci-dessus relatif au jeu d'articles imbriqué).
Itzik Ben-Gann a également une bonne vue d'ensemble des options les plus courantes de son livre "Inside Microsoft SQL Server 2005: Interrogation T-SQL".
Les principaux points à considérer lors du choix d'un modèle sont les suivants:
1) Fréquence de changement de structure - à quelle fréquence la structure réelle de l'arbre change-t-elle? Certains modèles offrent de meilleures caractéristiques de mise à jour de la structure. Il est toutefois important de séparer les modifications de structure des autres modifications de données. Par exemple, vous souhaiterez peut-être modéliser l'organigramme d'une entreprise. Certaines personnes vont modéliser cela comme une liste de contiguïté, en utilisant l'ID d'employé pour lier un employé à son superviseur. C'est généralement une approche sous-optimale. Une approche qui fonctionne souvent mieux consiste à modéliser la structure organisationnelle distincte des employés eux-mêmes et à conserver l'employé en tant qu'attribut de la structure. Ainsi, lorsqu'un employé quitte l'entreprise, la structure organisationnelle elle-même n'a pas besoin d'être modifiée, mais uniquement l'association avec l'employé qui a quitté l'entreprise.
2) L'arborescence est-elle lourde en écriture ou en lecture? Certaines structures fonctionnent très bien lors de la lecture de la structure, mais entraînent des frais supplémentaires lors de l'écriture dans la structure.
3) Quels types d’informations avez-vous besoin d’obtenir de la structure - certaines structures Excel permet de fournir certains types d’informations sur la structure. Exemples: trouver un nœud et tous ses enfants, trouver un nœud et tous ses parents, trouver le nombre de nœuds enfants répondant à certaines conditions, etc. Vous devez savoir quelles informations seront nécessaires à partir de la structure pour déterminer celle qui conviendra le mieux. vos besoins.
Jetez un oeil à Gestion des données hiérarchiques dans MySQL . Il aborde deux approches pour stocker et gérer des données hiérarchiques (sous forme d'arborescence) dans une base de données relationnelle.
La première approche est le modèle de liste de contiguïté, ce que vous décrivez essentiellement: avoir une clé étrangère qui fait référence à la table elle-même. Bien que cette approche soit simple, elle peut s'avérer très inefficace pour certaines requêtes, telles que la construction de tout l'arbre.
La deuxième approche abordée dans l'article est le modèle d'ensemble imbriqué. Cette approche est beaucoup plus efficace et flexible. Reportez-vous à l'article pour une explication détaillée et des exemples de requêtes.
Si vous devez utiliser Relational DataBase pour organiser la structure de données en arborescence, Postgresql propose un module graphique génial qui fournit le type de données permettant de représenter les étiquettes de données stockées dans une structure arborescente hiérarchique. Vous pouvez en tirer une idée (pour plus d’informations, voir: http://www.postgresql.org/docs/9.0/static/ltree.html )
En général, LDAP est utilisé pour organiser les enregistrements dans une structure hiérarchique.
Avoir une table avec une clé étrangère en soi a du sens pour moi.
Vous pouvez ensuite utiliser une expression de table commune dans SQL ou la connexion par instruction préalable dans Oracle pour créer votre arborescence.
Fantastique collection de fonctions prêtes à l’emploi qui peuvent être utilisées avec le modèle de liste de contiguïté pour simplifier la vie.
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
J'ai utilisé l'implémentation suivante sur SQL SERVER 2005. Check here
Si toute personne utilisant MS SQL Server 2008 et versions ultérieures atterrit sur cette question: SQL Server 2008 et versions ultérieures dispose d'une nouvelle fonctionnalité "hierarchyId" spécialement conçue pour cette tâche.
Plus d'infos sur https://docs.Microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server