web-dev-qa-db-fra.com

Comment stocker le répertoire / la hiérarchie / l'arborescence dans la base de données?

Comment stocker une structure de répertoire/hiérarchie/arborescence dans la base de données? À savoir MSSQL Server.

@olavk: Il ne semble pas que vous ayez vu ma propre réponse. La façon dont j'utilise est bien meilleure que les requêtes récursives :)

p.p.s. C'est la voie à suivre!

56
roman m

Il existe de nombreuses façons pour stocker les hiérarchies dans les bases de données SQL. Le choix dépend du produit SGBD que vous utilisez et de la façon dont les données seront utilisées. Comme vous avez utilisé la balise MSSQL2005, je pense que vous devriez commencer à considérer le modèle de "liste d'adjacence"; si vous trouvez qu'il ne fonctionne pas bien pour votre application, jetez un œil à comparaison de Vadim Tropashko qui met en évidence les différences entre les modèles en mettant l'accent sur plusieurs caractéristiques de performance.

18
Troels Arvin

Si l'utilisation de Sql Server 2008 est une option: vous devriez peut-être vérifier le nouveau type de données hierarchyid .

8
Rockcoder

Il existe également le modèle Nested-Set of Trees qui présente certains avantages par rapport au modèle ParentID. Voir http://www.evanpetersen.com/item/nested-sets.html et http://falsinsoft.blogspot.nl/2013/01/tree-in-sql- database-nested-set-model.html

5
Lars Truijens

C'est plus un signet pour moi qu'une question, mais cela pourrait aussi vous aider. J'ai utilisé l'approche de cet article pour stocker une structure de répertoire/arborescence dans la base de données.

L'article contient également des extraits de code utiles.

J'espère que cela t'aides.

Je ne suis d'aucune façon affilié à ce site Web

4
roman m

Utilisez-vous SQL Server 2005? Requêtes récursives rendent la requête de données hiérarchiques beaucoup plus élégante.

Edit: Je pense que les chemins matérialisés sont un peu un hack. Le chemin contient des données redondantes non normalisées et vous devez utiliser des déclencheurs ou quelque chose pour les maintenir à jour. Par exemple. si un nœud change de parent, tout le sous-arbre doit avoir ses chemins mis à jour. Et les requêtes de sous-arborescence doivent utiliser une correspondance de sous-chaîne laide plutôt qu'une jointure élégante et rapide.

3
JacquesB

La question est similaire à cette question qui a été fermée. J'ai trouvé les réponses aux deux questions très utiles dans mes activités, et elles m'ont finalement conduit au manuel MongoDB qui présente 5 façons différentes de modéliser les structures arborescentes: https://docs.mongodb.com/manual/applications/data -models-tree-structures /

Bien que MongoDB ne soit pas une base de données relationnelle, les modèles présentés s'appliquent aux bases de données relationnelles, ainsi qu'à d'autres formats tels que JSON. Vous devez clairement déterminer quel modèle est bon en fonction des avantages/inconvénients présentés.

L'auteur de cette question a trouvé une solution qui combinait les modèles Parent et Materialized Paths. Le maintien de la profondeur et du parent pourrait présenter certains problèmes (logique supplémentaire, performances), mais il y a clairement des avantages pour certains besoins. Pour mon projet, les chemins matérialisés fonctionneront mieux et j'ai surmonté certains problèmes (tri et longueur du chemin) grâce aux techniques de l'article this .

2
Andrew

J'ai rencontré le même problème avec l'un de mes projets. Nous avions une énorme hiérarchie qui ne cessera d'augmenter pour toujours. J'avais besoin de le parcourir rapidement puis de trouver le bon groupe après quelques validations complexes. Plutôt que d'aller sur SQL Server et de me gratter la tête, comment puis-je le faire efficacement là-bas quand je savais que les requêtes récursives sont la seule solution viable. Mais savez-vous vraiment s'il existe une optimisation possible dans les requêtes récursives. Y a-t-il une garantie que votre hiérarchie n'augmentera pas à l'avenir et un beau jour vous découvrez que vos requêtes récursives sont trop lentes pour être utilisées en production?

J'ai donc décidé de donner un coup de feu à Neo4J. C'est une base de données graphique avec de nombreux algorithmes utiles intégrés, une traversée incroyablement rapide avec une documentation et des exemples décents. Stockez la hiérarchie dans Neo4J et accédez à la hiérarchie à l'aide d'un service d'épargne (ou autre chose). Oui, vous devrez écrire du code qui intégrera vos requêtes SQL avec Neo4J mais vous aurez une solution évolutive et plus évolutive.

Espérant que ceci puisse t'être utile.

2
Marut Singh

La manière typique est une table avec une clé étrangère (par exemple "ParentId") sur elle-même.

1
Sklivvz