53

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

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

p.p.s. This is le chemin à parcourir!

+0

Ce que vous préconisez est le modèle de codage «chemin matérialisé». Cette approche est facile à comprendre mais est inefficace pour certaines opérations, voir http://vadimtropash.wordpress.com/2008/08/09/one-more-nested-intervals-vs-adjacency-list-comparison/ –

+2

Ceci est un bonne question ... – anbanm

Répondre

17

Il existe many ways pour stocker des hiérarchies dans des bases de données SQL. Le choix dépend du produit SGBD que vous utilisez et de la manière 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, alors jetez un oeil à Vadim Tropashko's comparison qui met en évidence les différences entre les modèles en mettant l'accent sur les caractéristiques de performance multiples.

4

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

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

Espérons que cela aide.

Je ne suis pas affilié à ce site de quelque manière que

3

Utilisez-vous SQL Server 2005? Recursive queries rendre l'interrogation des données hiérarchiques beaucoup plus élégant. 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 garder à 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.

+0

Il y a de grands compromis quand il s'agit de mettre en œuvre ce type de solution. L'approche récursive, qui était mon préféré, est élégante, mais moins efficace, car les chemins doivent être calculés plus fréquemment. – izilotti

1

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

4

Il existe également le modèle d'arbres imbriqués 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

+0

@Ali - Votre lien est cassé aussi! – NightOwl888

+0

@ NightOwl888 Oui, il est devenu cassé. Je viens de passer 20 minutes googling et n'a pas réussi à le trouver ... J'ai donc supprimé le commentaire avec le lien brisé. – Ali

+2

J'ai mis à jour ma réponse avec quelques liens de travail –

8

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

+0

+1. J'étais sur le point de le mentionner! –

2

J'ai fait face au même problème avec un de mes projets. Nous avions une énorme hiérarchie qui continuera à 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 à SQL Server et de me gratter la tête, comment puis-je le faire efficacement quand je savais que les requêtes récursives sont la seule solution viable. Mais savez-vous vraiment s'il y a 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écouvrirez 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 de graphes 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 va intégrer vos requêtes SQL avec Neo4J mais vous aurez une solution évolutive et plus pérenne.

J'espère que vous trouverez cela utile.

2

La question est similaire à this question qui a été fermée. J'ai trouvé des réponses à deux questions très utiles dans mes activités, et ils ont fini par me conduisirent au manuel MongoDB qui présente 5 différentes façons de modéliser les structures d'arbres: https://docs.mongodb.com/manual/applications/data-models-tree-structures/

Alors que MongoDB n'est pas une base de données relationnelle, les modèles présentés sont applicables aux bases de données relationnelles, ainsi que d'autres formats tels que JSON. Vous avez clairement besoin de savoir quel modèle est bon en fonction des avantages/inconvénients présentés.

L'auteur de cette question a trouvé un solution qui combinait les modèles Parent et Materialized Paths. Maintenir la profondeur et le parent pourrait présenter quelques problèmes (logique supplémentaire, performance), mais il y a clairement des avantages pour certains besoins. Pour mon projet, Materialized Paths fonctionnera mieux et j'ai surmonté certains problèmes (tri et longueur de chemin) à travers des techniques de l'article this.

Questions connexes