Devo memorizzare un albero in un database, quindi qual è il modo migliore per farlo? Mostra il metodo che usi e dai il nome ai suoi pro e contro. (Sto usando SQL Server 2005)Come memorizzare un albero nel database SQL
risposta
Ho trovato la discussione nello SQL Anti-patterns molto utile, in quanto si concentra anche sugli aspetti negativi di ogni implementazione.
Inoltre, le diapositive 48-77 in this presentation reiterano tale analisi.
In conclusione, non esiste un albero generico e nessun punto d'argento per gli alberi SQL. Dovrai chiederti dei dati, come e quanto saranno selezionati, modificati, i rami saranno spostati, ecc. E sulla base di tali risposte implementare una soluzione adeguata.
Bene, il modo più semplice sarebbe che un record abbia una colonna ParentID in modo che sappia quale record è suo padre. Questa è una pratica abbastanza normale. Ad esempio, un negozio online potrebbe avere una gerarchia di categorie di prodotti. Ogni categoria avrà un ParentID. Esempio: la categoria "Jeans" in un database di abbigliamento potrebbe avere "Pantaloni" come categoria principale. È un po 'più difficile se si desidera che un record indichi quali sono i suoi figli, a meno che non si limiti il numero di bambini. Se vuoi un albero binario, potresti avere colonne LeftChildID e RightChildID. Se autorizzi un numero qualsiasi di bambini, potresti avere una colonna Bambini con ID delimitata da virgole (come 1,4,72,19
) ma ciò renderà le query piuttosto difficili. Se il tuo database consente tipi di array in colonne, puoi probabilmente usare una matrice invece di una stringa delimitata, che sarebbe facile da interrogare - ma non sono sicuro che MS SQL Server lo supporti o meno.
Oltre a ciò, dipende dal tipo di dati che si sta modellando e anche dal tipo di operazioni che si prevede di eseguire con questo albero.
provare questo: Hierarchies (trees) in SQL Server 2005
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
ho scoperto che una guida molto utile.
Ci sono due approcci generali
- In ogni record, memorizzare l'ID del genitore in una colonna nullable (la radice dell'albero non ha genitore) nidificato tecnica del modello di serie
- Usa Joe Celko spiegato here e (grazie al commento da @onedaywhen), anche in quella che è la fonte originale here
EDIT: nuovo link per questo materiale è here.
Pro e Contro? !! Stai scherzando, vero ?!
Celko attribuisce il modello dell'insieme nidificato a Michael Kamfonas, anche se Celko sembra aver coniato la frase e certamente ha lucidato e reso popolare la tecnica. – onedaywhen
+1 - Ho appena usato l'articolo di Celko alcune settimane fa ed è stato molto utile. –
I collegamenti in questa risposta sono purtroppo interrotti ora. Qualcuno sa dove altro trovare queste informazioni? – Qqwy
Ho fatto questo in passato memorizzando i dati come xml in SQL.
Questo link è morto; reindirizza alla homepage. – Qqwy