2009-09-29 8 views
5

In MySQL, devo conservare le categorie in questo modo:generare pangrattato di categorie archiviati in MySQL

categorie: - category_id - category_name - parent_category_id

Quale sarebbe il modo più efficace per generare la traccia/breadcrumb per un determinato category_id?

Per esempio pangrattato (category_id): Generale> Sub 1> Sub 2

ci potrebbe essere nelle teorie livelli illimitati. Sto usando php.

AGGIORNAMENTO: Ho visto questo articolo (http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) sul modello di set nidificato. Sembra interessante, ma come si fa a gestire dinamicamente le categorie? Sembra più facile sulla carta, come quando sai in anticipo le categorie, ma non quando l'utente può creare/cancellare/modificare categorie al volo ... Cosa ne pensi?

+1

query gerarchiche in MySQL: http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ –

risposta

0

Generalo (a piacere) da un modello genitore tradizionale e memorizzalo nella cache. È troppo costoso per generarlo al volo e le modifiche alla gerarchia sono di solito di diversi ordini di grandezza meno frequenti di altre modifiche. Non mi preoccuperei del modello degli insiemi nidificati dato che la gerarchia cambierà e quindi dovrai ingannare con le sinistre e i diritti. (Si noti che l'articolo includeva solo le ricette per l'aggiunta e l'eliminazione - non la reingegnerizzazione - che è molto semplice nel modello principale).

1

Mi piace utilizzare il metodo Materialized Path poiché esso contiene essenzialmente il percorso del breadcrumb e semplifica operazioni come selezionare tutti i discendenti di un nodo senza utilizzare query ricorsive.

materializzato modello Path

L'idea con il modello di percorso materializzate è di collegare ciascun nodo nella gerarchia con la sua posizione nella struttura. Questo viene fatto con un elenco concatenato di tutti gli antenati dei nodi. Questo elenco è solitamente memorizzato in una stringa delimitata. Nota il campo "Linage" sotto. CAT_ID NAME CAT_PARENT Lineage 1 Home . 2 product 1 .1 3 CD’s 2 .1.2 4 LP’s 2 .1.2 5 Artists 1 .1 6 Genre 5 .1. 5 7 R&B 6 .1. 5.6 8 Rock 6 .1. 5.6 9 About Us 1 .1

Attraversamento tavolo

Select lpad('-',length(t1.lineage))||t1.name listing 
From category t1, category t2 
Where t1.lineage like t2.lineage ||'%' 
    And t2.name = 'Home'; 
Order by t1.lineage; 

Listing

Home 
-product 
–CD’s 
–LP’s 
-Artists 
–Genre 
—R&B 
—Rock 
-About Us 
+0

Il link è morto – lapin

+0

@lapin funziona per me, contenuti aggiunti sopra – RedFilter

0

La bellezza di insiemi nidificati è che si può facilmente aggiungere/rimuovere i nodi dal grafico con pochi semplici istruzioni SQL . Non è molto costoso e può essere codificato abbastanza rapidamente.

Se si utilizza PHP (o anche se non lo si utilizza), è possibile consultare questo codice per vedere un'implementazione abbastanza semplice di adding nodes to a nested set model (archive.org backup). Rimozione (o anche in movimento) è altrettanto semplice.

+0

Il link è morto – lapin

+0

@lapin - Aggiunto il link archive.org del link morto. – timdev