2011-11-15 23 views
7

Durante la ricreazione del mio CMS, volevo un'alternativa all'approccio padre/figlio tradizionale per la gestione della gerarchia sitemap/pagina. Mi ero ricordato di aver visto il modello del set annidato qualche tempo fa, ma non riuscivo a ricordare come veniva chiamato. Quindi, mi sono imbattuto in un approccio simile che voglio valutare e confrontare le proprietà, assicurandomi di non incorrere in limitazioni stupide in seguito perché non sono andato con quello che è già testato nel tempo. Quindi, si prega di avvisare se A) è già stato inventato (come si chiama ?!), B) ci sono difetti fondamentali nelle proprietà, o C) è un buon approccio (si prega di dare una buona giustificazione!).Il mio alernativo a insiemi nidificati per insiemi di dati gerarchici a profondità arbitraria: buono o cattivo?

Considerate questo elenco:

  • casa
    • Chi siamo
    • Contattaci
    • Prodotti
      • abbigliamento
      • Libri
      • Elettronica
    • Knowledge Base
    • Altre cose

Nel modello set nidificato, credo si memorizzano i/descrittori Destra Sinistra per ogni nodo con una profondità prima attraversamento:

Home     1-18 
    About Us   2-3 
    Contact Us  4-5 
    Products   6-13 
     Clothing  7-8 
     Books   9-10 
     Electronics 11-12 
    Knowledge Base 14-15 
    Other stuff  16-17 

Ed ecco il mio "modo sbagliato" che sto iniziando a mi piace di più:

Home     1-9 
    About Us   2-2 
    Contact Us  3-3 
    Products   4-7 
     Clothing  5-5 
     Books   6-6 
     Electronics 7-7 
    Knowledge Base 8-8 
    Other stuff  9-9 

Piuttosto che una coppia sinistra/destra, sto memorizzando ID e LAST_CONTAINED_ID. Ho trovato che molte delle proprietà sono gli stessi (o molto simile):

  • Il nodo radice è ID = 1
  • Per "foglie", entrambe le proprietà sono uguali, mentre con rami, non sono
  • il numero totale di "sotto-nodi" per ogni nodo è LAST_CONTAINED_ID - ID
  • Tutti contenute nodi hanno un ID> ID del contenitore, ma < = del contenitore LAST_CONTAINED_ID
  • I nodi antenati hanno un ID < il bambino ID , ma anche un LAST_CONTAINED_ID> = l'ID figlio
  • La profondità è la somma dei antenato nodi

Inoltre, l'ID serve una, identificatore univoco specifico per ordine (senza spazi!). Ho trovato più semplice anche memorizzare i riferimenti DEPTH e PARENT per semplicità, ma questo è praticamente lo stesso per i set nidificati anche da quello che ho capito.

Quindi, questo conta come un insieme annidato? Ed è già un approccio comune (ma perché non ne avevo sentito parlare prima ...)? C'è una buona ragione per cui dovrei usare un vero set annidato su questo?

Apprezzo i tuoi pensieri.

+0

FYI, il modello di serie nidificato è un modo di avere una singola tabella in un archivio RDBMS tutte le informazioni necessarie per una gerarchia di una profondità sconosciuta (cioè una lista infinita senza ricorsione): http://en.wikipedia.org/wiki/Nested_set_model#Example – landons

risposta

4

L'unico vantaggio che offre è la funzionalità 'senza spazi vuoti', ma per ottenere ciò è necessario modificare la logica applicata ai valori di destra. Nel modello originale, ottieni i figli di "Prodotti" vedendo tutti quei valori 6 < .. < 13, ma nel tuo modello, ottieni quei bambini vedendo i valori 4 < .. < = 7. Dovendo trattare bene- valori diversi da quelli a sinistra lo rendono leggermente meno elegante.
Un altro inconveniente minore è che nell'originale, il salto da 12 a 14 evidenzia che hai cambiato livello, mentre nel tuo modello non ottieni tali segnali visivi.
Quindi se sei felice di utilizzare (<, < =) al posto di (<, <), quindi funziona. (Dal momento che sembra essere equivalente, non posso dire "buono" o "cattivo", ma hai già evidenziato i pericoli dell'implementazione del percorso meno percorso.)

+2

Penso che tu abbia ragione sul salto da 12-14. Credo che sia vero (nei soliti insiemi nidificati), che per ogni nodo 'n1', se c'è un nodo,' n2', con 'n1.right + 1' ==' n2.left' allora 'n2' è il prossimo fratello (e allo stesso modo per andare a sinistra), che si perde in questo nuovo modello. –

+0

Questo è esattamente quello che stavo cercando! (Anche se, speravo di ottenere più feedback, ma questo è utile.) – landons

+1

Ho trovato alcune proprietà in più che mi piacciono, tale regolazione dei valori su insert/delete su un indice particolare è molto semplice. L'eliminazione di un ramo sposterà effettivamente tutti i bambini su un livello per impostazione predefinita (che è una buona alternativa alle eliminazioni a cascata per una tradizionale configurazione di chiave esterna genitore-figlio). Penso che possa vivere senza la semplicità di NextSibling(). – landons

Problemi correlati