2010-07-15 6 views
6

Diciamo che abbiamo una tabella con i commenti degli utenti. I commenti di primo livello hanno un riferimento a un articolo a cui sono allegati. I commenti a livello più profondo non hanno questo riferimento in base alla progettazione, ma hanno un riferimento al suo commento principale.Qual è la migliore pratica per prelevare un albero di nodi dal database per ulteriori rendering?

Per questa struttura di database, quale sarebbe il modo più efficiente per recuperare tutti i commenti per un dato articolo e quindi renderlo in formato html? (Supponiamo di avere circa 200 commenti di primo livello e il livello più profondo di 20)

+0

Nota: il tuo titolo richiede la "migliore pratica" ma la tua domanda richiede "il modo più efficiente". Questi non sono necessariamente gli stessi. –

risposta

9

In genere raccomando un disegno denominato Tabella di chiusura.

vedi esempio nella mia risposta alla What is the most efficient/elegant way to parse a flat table into a tree?

Ho anche disegnato questa presentazione: Models for Hierarchical Data with SQL and PHP. Ho sviluppato un'app PHP che esegue il rendering di un albero in 0,3 secondi, da una raccolta di dati gerarchici con 490 nodi.

Ho bloggato sul tavolo di chiusura qui: Rendering Trees with Closure Table.

Ho scritto un capitolo sulle diverse strategie per i dati gerarchici nel mio libro, SQL Antipatterns: Avoiding the Pitfalls of Database Programming.

5

Per il modo più efficiente, Quassnoi ha scritto una serie di articoli su questo argomento.

vi consiglio di leggere il primo articolo e adattare gli esempi per lavorare con la vostra tabella specifica, ma il punto cruciale è quello di fare una funzione che può recitare oltre la r o hai bisogno di andare a prendere. Probabilmente vuoi anche il livello (profondità nell'emirarchia), quindi anche il secondo articolo è probabilmente rilevante.

Gli altri articoli possono essere utili se è necessario creare altri tipi di query sui dati. Ha anche un articolo Adjacency list vs. nested sets: MySQL in cui confronta le query altamente ottimizzate sia per il modello di adiacenza che per il modello di serie nidificata.