Sfortunatamente, se non puoi modificare il modello di dati e stai utilizzando MySQL, sei bloccato in una situazione in cui hai bisogno di query ricorsive e stai utilizzando un DBMS che non supporta le query ricorsive.
Quassnoi ha scritto un'interessante serie di articoli sul blog, mostrando le tecniche per interrogare i dati gerarchici. Le sue soluzioni sono abbastanza intelligenti, ma molto complesse.http:// spiegareextended.com/2009/03/17/hierarchical-queries-in-mysql/
PostgreSQL è un altro RDBMS open source, che supporta le query ricorsive , in modo da poter recuperare un intero albero memorizzato nel modo in cui lo mostri. Ma se non puoi cambiare il modello di dati, suppongo che non puoi passare a un RDBMS diverso.
Esistono diversi modelli di dati alternativi che rendono molto più facile recuperare alberi arbitrariamente profondi:
- Tabella di chiusura
- Set nidificati, noti anche come traversata dell'albero dei preordini modificati
- Enumerazione del percorso, nota anche come percorso materializzato
Li tratterò nella mia presentazione Modelli per dati gerarchici con SQL e PHP e nel mio libro SQL Antipatterns:evitare le insidie della programmazione di database .
Infine, c'è un'altra soluzione che ho visto usata nel codice per Slashdot , per le gerarchie dei commenti:memorizzano "parent_id" come in Adjacency List, ma memorizzano anche una colonna "root_id". Ogni membro di un dato albero ha lo stesso valore per root_id, che è il nodo antenato più alto nel suo albero. Quindi è facile recuperare un intero albero in una query:
SELECT * FROM site WHERE root_id = 123;
Quindi la tua applicazione recupera tutti i nodi dal database in un array e devi scrivere il codice per eseguire il loop su questo array, inserendo i nodi in una struttura di dati ad albero in memoria. Questa è una buona soluzione se hai molti alberi separati e ogni albero ha relativamente poche voci. Va bene per il caso di Slashdot.