2009-11-05 10 views
23

Sto provando a creare un modello per la categorizzazione di alcuni oggetti.Django treebeard quali sono le differenze tra AL, NS, MP

Ho già provato a utilizzare django-mptt per recuperare facilmente le categorie correlate e ora sto cercando soluzioni diverse per trovare la migliore.

Non riesco a scoprire quali siano le principali differenze tra percorso materializzato, elenco di adiacenza e insieme nidificato. Wikipedia non mi ha dato una risposta breve, tutto quello che so è che il mptt è probabilmente Nested Set ...

Qualcuno può spiegarmelo in poche parole?

risposta

51

È più semplice da spiegare con gli esempi che con poche parole. Considera l'albero dei campioni, memorizzando i nomi:

William 
    Jones 
    Blake  
     Adams   
    Tyler  
Joseph 
    Miller 
    Flint 

Percorso materializzato significa che ogni nodo memorizza il suo percorso completo codificato. Per esempio, è possibile memorizzare il suo indice utilizzando un punto come separatore

Name  Path 
William  1 
Jones  1.1 
Blake  1.2 
Adams  1.2.1 
Tyler  1.3 
Joseph  2 
Miller  2.1 
Flint  2.2 

Quindi, Adams conosce il suo nome completo è William Blake Adams, perché ha il percorso 1.2.1, indicando il nodo 1 al primo livello - William - al nodo 1.2 a livello 2 - Blake - e al nodo 1.2.1 a livello 3 - Adams.

Adjacency List significa che l'albero è memorizzato mantenendo un collegamento ad alcuni nodi adiacenti. Ad esempio, è possibile memorizzare chi è il genitore e chi è il fratello successivo.

Name  Parent  Next 
William  null  Joseph 
Jones  William Blake 
Blake  William Tyler 
Adams  Blake  null 
Tyler  William null 
Joseph  null  null  
Miller  Joseph  Flint 
Flint  Joseph  null 

Si noti che potrebbe essere semplice come solo la memorizzazione del genitore, se non abbiamo bisogno di tenere i bambini di un nodo ordinato. Ora Adams può ottenere tutti i suoi antenati in modo ricorsivo fino a zero per trovare il suo nome completo.

Set nidificati significa che ogni nodo viene archiviato con un indice, di solito un valore sinistro e uno destro, assegnato a ciascuno mentre si attraversa l'albero nell'ordine DFS, in modo da sapere che i suoi discendenti si trovano all'interno di tali valori. Ecco come i numeri sarebbero assegnate all'esempio albero:

1 William 10 
    2 Jones 3 
    4 Blake 7 
     5 Adams 6 
    8 Tyler 9 
11 Joseph 16 
    12 Miller 13 
    14 Flint 15 

e sarebbe archiviato come:

Name  left right 
William  1  10 
Jones  2  3 
Blake  4  7 
Adams  5  6 
Tyler  8  9 
Joseph  11  16 
Miller  12  13 
Flint  14  15 

Così, ora Adams riesce a trovare i suoi antenati di interrogazione che ha un basso a sinistra e un valore in alto a destra e ordinali per il valore di sinistra.

Ogni modello ha i suoi punti di forza e di debolezza. Scegliere quale utilizzare dipende in realtà dalla tua applicazione, dal database che stai usando e dal tipo di operazioni che farai più spesso. È possibile trovare un buon confronto here.

Il confronto menziona un quarto modello che non è molto comune (non conosco altre implementazioni ma la mia) e molto complicato da spiegare in poche parole: Intervallo nidificato tramite Matrix Encoding.

Quando si inserisce un nuovo nodo in un set nidificato, è necessario ri-enumerare tutti quelli che lo precedono nella traversata. L'idea dietro gli intervalli annidati è che esiste un numero infinito di numeri razionali tra due numeri interi, quindi è possibile memorizzare il nuovo nodo come frazione dei suoi nodi precedenti e successivi.Memorizzare e interrogare le frazioni può essere problematico, e questo porta alla tecnica di codifica a matrice, che trasforma quelle frazioni in una matrice 2x2 e molte operazioni possono essere eseguite da un'algebra di matrice che non è evidente a prima vista, ma può essere molto efficiente.

Treebeard ha implementazioni molto semplici di ciascuna di Percorso materializzato, Set nidificati e Elenchi di adiacenza, senza ridondanza. django-mptt usa effettivamente un mix di Nested Sets e Adjacency Lists, poiché mantiene anche un collegamento al genitore e può usarlo sia per interrogare i bambini in modo più efficiente, sia per ricostruire l'albero nel caso in cui venga incasinato da qualcuno.

Problemi correlati