Question

Je suis curieux de savoir quelle est la meilleure façon (les meilleures pratiques) pour gérer les hiérarchies sont en ce qui concerne la conception de base de données. Voici un petit exemple de la façon dont je les manipule habituellement.

Table Node

NodeId int PRIMARY KEY
NodeParentId int NULL
DisplaySeq int NOT NULL
Title nvarchar(255)

Ancêtre table

NodeId int
AncestorId int
Hops int

avec des index sur NodeId, AncestorId, Houblon

Les tableaux ressemblent à ceci:

Table Node

NodeId    NodeParentId    DisplaySeq    Title
1         NULL            1             'Root'
2         1               1             'Child 1'
3         1               2             'Child 2'
4         2               1             'Grandchild 1'
5         2               2             'Grandchild 2'

Ancêtre table

NodeId    AncestorId    Hops
1         NULL          0
1         1             0
2         1             1
2         2             0
3         1             1
3         3             0
4         1             2
4         2             1
4         4             0
5         1             2
5         2             1
5         5             0

Avec cette conception, j'ai trouvé que de grandes hiérarchies je peux obtenir une section entière de la hiérarchie très rapidement en se joignant à la table Ancêtre pour AncestorId = NodeId cible, comme:

SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId

Il est aussi facile d'obtenir les enfants directs et

SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
AND Hops = 1

Je suis intéressé à savoir ce que les autres solutions que vous avez peut-être utilisé pour ce genre de chose. Dans mon expérience, les hiérarchies peuvent obtenir assez velu, et une façon d'optimiser leur récupération est très important.

Était-ce utile?

La solution

MarkusQ et n8wrl ont déjà souligné, Joe Celko a quelques bonnes choses à ce sujet. Je vais juste ajouter qu'il ya plusieurs façons de modéliser une hiérarchie (le livre de Joe contient plusieurs, je crois, pas seulement celui qu'il considère le « meilleur »). Votre décision finale, nous l'espérons prendre en compte vos besoins spécifiques. Certaines des différentes façons de modéliser sont mieux pour les opérations intensives d'écriture tandis que d'autres sont mieux pour les lectures fréquentes ou rapides et en bas de la hiérarchie. Il suffit de garder à l'esprit ce que votre système est en train de faire avec.

Autres conseils

Il y a quelques extensions spécifiques au fournisseur de le faire, mais ma façon db-neutre favori vient de Joe Celko - google 'Joe Celko arbres et Hiérarchies' ou acheter ce livre: lien texte

Ceci est un moyen à base de set-très intelligent d'aller. Facile à interroger la hiérarchie. J'ai ajouté le champ « parentID » vous avez juste parce que je pose les questions beaucoup et que les vitesses les « enfants directs » et « parent » vers le haut. Mais ceci est une merveilleuse façon d'obtenir une « ascendance » ou requête « de descdent ».

Vous pouvez également vérifier le motif « ensembles imbriqués »:

  

http://www.intelligententerprise.com/001020/celko.jhtml   (Lien brisé)

Ou vous pouvez Google pour obtenir plus.

P.S .: Malédictions, n8wrl , vous tapez plus vite que moi!

SQL Server 2008 introduit hierarchyid type de données

Dans Oracle, vous pouvez utiliser CONNECT BY / START AVEC pour interroger les données hiérarchiques. Dans SQL Server, vous pouvez utiliser une procédure stockée, qui appelle lui-même récursive.

Je recommande vivement des ensembles imbriqués. Ils sont grands.

http://threebit.net/tutorials/nestedset/tutorial1.html http://www.dbmsmag.com/9603d06.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top