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.
insiemi nidificati! Questo è il termine che stavo cercando! – n8wrl
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. –
Sì. Ed è qui che la risposta di Tom H è così importante. Per me, questo funziona meravigliosamente sulle gerarchie che ho cambiato molto raramente. – n8wrl