2009-02-25 9 views
7

Sono curioso di sapere quale sia il modo migliore (best practice) per gestire le gerarchie relativamente alla progettazione del database. Ecco un piccolo esempio di come li gestisco abitualmente.Gestione dei dati di gerarchia nel database

nodo Tabella

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

Ancestor Tabella

NodeId int 
AncestorId int 
Hops int 

con indici in NodeId, AncestorId, luppolo

tabelle simile a questa:

nodo Tabella

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' 

Ancestor Tabella

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 

Con questo progetto, ho scoperto che con grandi gerarchie posso ottenere un'intera sezione della gerarchia molto rapidamente unendo sul Tabella degli antenati per AncestorId = target NodeId, come:

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

È anche e asa per avere figli diretti pure

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

Sono interessato a sapere quali altre soluzioni potresti aver usato per questo tipo di cose. Nella mia esperienza, le gerarchie possono diventare piuttosto pelose, e qualsiasi modo per ottimizzare il loro recupero è molto importante.

risposta

4

Come MarkusQ e n8wrl hanno già fatto notare, Joe Celko ha alcune cose buone su questo.Aggiungerò solo che esistono diversi modi per modellare una gerarchia (il libro di Joe contiene diversi credo, non solo uno che considera il "migliore"). Si spera che la vostra decisione finale tenga conto delle vostre esigenze specifiche. Alcuni dei diversi modi per modellarlo sono migliori per le operazioni di scrittura intensiva, mentre altri sono migliori per letture frequenti o veloci su e giù per la gerarchia. Basta tenere a mente che cosa farà il tuo sistema con esso.

10

ci sono alcune estensioni specifiche del fornitore per fare questo, ma il mio modo di db-neutral preferito viene da Joe Celko - google 'Joe Celko Alberi e gerarchie' o comprare questo libro: link text

Questo è un molto intelligente modalità basata su set per andare. Facile gerarchia di query. Ho aggiunto il campo 'parentID' che hai solo perché chiedo molto alle domande 'direct children' e 'parent' e questo accelera le cose. Ma questo è un modo meraviglioso per ottenere una query 'ancestry' o 'descdent'.

6

Si consiglia inoltre di controllare il modello "insiemi annidati":

http://www.intelligententerprise.com/001020/celko.jhtml (link non funzionante)

Oppure si può Google per più.

P.S .: Maledizioni, n8wrl, digiti più veloce di me!

+0

insiemi nidificati! Questo è il termine che stavo cercando! – n8wrl

+0

Articolo piuttosto interessante. L'unico problema che ho sempre avuto è l'aggiunta/eliminazione di un nodo, è necessario aggiornare la posizione di ogni altro nodo dopo di esso. –

+0

Sì. Ed è qui che la risposta di Tom H è così importante. Per me, questo funziona meravigliosamente sulle gerarchie che ho cambiato molto raramente. – n8wrl

1

In Oracle, è possibile utilizzare CONNECT BY/START WITH per eseguire query sui dati gerarchici. In SQL Server, è possibile utilizzare una stored procedure, che si chiama in modo ricorsivo.

+0

Ho usato le chiamate ricorsive ma la query viene eseguita molto lentamente, motivo per cui ho implementato la tabella Ancestor, in modo da poter uscire da una chiamata ricorsiva. –