Supponendo che la vostra unica preoccupazione è seleziona e non inserti/aggiornamenti/elimina, questo dipende dalle esigenze, come ad esempio:
- hai bisogno di sapere quale livello ogni nodo è a?
- Hai bisogno di sapere se ogni nodo ha figli mentre lo sta visualizzando?
- Hai bisogno di ordinare i fratelli per nome?
Tuttavia, se ci sono davvero delle modifiche minime all'albero che viene fatto, allora non importa quale schema si usa, dato che si può fare tutto il lavoro nel livello applicazione e mettere in cache l'output.
Edit:
Quando le questioni di ordine, di solito andare per il metodo materialized path, e aggiungere un SortPath colonna aggiuntiva.In questo modo puoi ottenere i risultati ordinati per fratello, che è una denormalizzazione che rende estremamente facile il rendering dell'albero in HTML, dato che puoi scrivere l'intero albero (o qualsiasi porzione) esattamente nell'ordine in cui ricevi i record usando una singola query . Questo è ottimale per la velocità ed è il modo più semplice per ordinare più di un livello alla volta.
Es,
CREATE TABLE [dbo].[MatPath](
[ID] [int] NULL,
[Name] [varchar](50) NULL,
[Path] [varchar](max) NULL,
[SortPath] [varchar](max) NULL
)
insert into MatPath (ID, Name, Path, SortPath) values (1, 'Animal', '1', 'Animal-1')
insert into MatPath (ID, Name, Path, SortPath) values (2, 'Dog', '1.2', 'Animal-1|Dog-2')
insert into MatPath (ID, Name, Path, SortPath) values (3, 'Horse', '1.3', 'Animal-1|Horse-3')
insert into MatPath (ID, Name, Path, SortPath) values (4, 'Beagle', '1.2.4', 'Animal-1|Dog-2|Beagle-4')
insert into MatPath (ID, Name, Path, SortPath) values (5, 'Abyssinian', '1.3.5', 'Animal-1|Horse-3|Abyssinian-5')
insert into MatPath (ID, Name, Path, SortPath) values (6, 'Collie', '1.2.6', 'Animal-1|Dog-2|Collie-6')
select *
from MatPath
order by SortPath
uscita:
ID Name Path SortPath
------ --------------- ----------- --------------------------------
1 Animal 1 Animal-1
2 Dog 1.2 Animal-1|Dog-2
4 Beagle 1.2.4 Animal-1|Dog-2|Beagle-4
6 Collie 1.2.6 Animal-1|Dog-2|Collie-6
3 Horse 1.3 Animal-1|Horse-3
5 Abyssinian 1.3.5 Animal-1|Horse-3|Abyssinian-5
(6 row(s) affected)
È possibile determinare il livello di ciascun nodo contando tubi (o periodi) nello strato di applicazione, o in SQL usando qualsiasi funzione built-in o personalizzata che può count occurrences of a string.
Inoltre, noterete che aggiungo lo ID
allo Name
durante la creazione di SortPath
. Questo per garantire che due nodi fratelli con lo stesso nome vengano sempre restituiti nello stesso ordine.
Hai detto che i tuoi alberi possono essere profondi N e larghi? Di solito è caratterizzato da N deep e B (branching factor) wide. Un albero profondo 10 ha davvero nodi di 10 bambini? B è un numero * fisso *? –
Ciao Ira. No B non è un numero fisso. L'accordo è che A può avere n categorie, e ognuna di queste può avere altre n categorie, indefinitamente. Suppongo anche che questo albero non sia molto grande, ma dal momento che abbiamo molti utenti, la soluzione più semplice (emettere una query per ogni livello) può essere troppo costosa. –