Structure de l'arbre de requête de données dans SQL Server
J'ai une table Person
qui a 3 colonnes: Id, Name, ParentId
où ParentId
est le Id
de la ligne parent.
Actuellement, pour afficher la totalité de l'arbre, il faudrait parcourir tous les éléments d'enfant jusqu'à ce qu'il n'y a pas plus d'éléments enfants. Il ne semble pas trop efficace.
Est-il un meilleur et plus efficace d'interroger ces données?
Aussi, est-il une meilleure façon de représenter cet arbre comme la structure dans une base de données SQL Server? Une autre conception de ma table/base de données?
Voir stackoverflow.com/questions/935098/... pour la même question avec des réponses.
Voir le projet de Loi Karwin SQL Antipatterns grève série de diapositives - il décrit plusieurs antipatterns - parmi eux, les "naïfs arbre" que vous avez - et propose des solutions possibles. Il dispose également d'un grand livre du même nom de SQL Antipatterns - hautement recommandé!
Voir le projet de Loi Karwin SQL Antipatterns grève série de diapositives - il décrit plusieurs antipatterns - parmi eux, les "naïfs arbre" que vous avez - et propose des solutions possibles. Il dispose également d'un grand livre du même nom de SQL Antipatterns - hautement recommandé!
OriginalL'auteur Ryan | 2012-04-29
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas qu'il ya quelque chose de mal avec la conception, en supposant que vous avez un niveau limité de relations parent-enfant. Voici un exemple rapide de la récupération de la relation à l'aide d'une expression de table commune récursive:
N'oubliez pas de nettoyer:
Cela peut être un article utile. Une alternative est
hierarchyid
mais je le trouve trop complexe pour la plupart des scénarios.Oui, bien sûr.
OriginalL'auteur Aaron Bertrand
Aaron Bertrands réponse est très bon pour le cas général. Si vous ne jamais avoir besoin d'afficher la totalité de l'arbre à la fois, vous pouvez simplement des requêtes sur l'ensemble du tableau et effectuer l'arbre-le renforcement de la mémoire. C'est probablement à être plus pratique et plus flexible. La Performance sera également légèrement meilleure (l'ensemble de la table doit être téléchargé de toute façon et C# est plus rapide pour les calculs de SQL Server).
Si vous avez besoin seulement d'une partie de l'arbre, cette méthode n'est pas recommandée, car vous seriez le téléchargement de plus de données que nécessaire.
OriginalL'auteur usr