Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Mysql : La gestione delle relazioni nei database - l'enumerazione di percorsi

Proseguiamo il tutorial relativo alla gestione delle relazioni "padre-figlio" in un database Mysql. Dopo aver visto il metodo classico, quello delle liste di adiacenza, vediamo oggi l'enumerazione di percorsi: una soluzione usata anche da Magento

Mysql

Il metodo di enumerazione dei percorsi prevede la dichiarazione esplicita dell'albero di ciascuna categoria. Anzichè memorizzare l'id del record "genitore", andiamo a scrivere nel database l'intero percorso, ricalcando un metodo tutto sommato molto famigliare, quello dell'esplora risorse di un moderno sistema operativo. Un esempio renderà tutto molto chiaro.
La tabella rimane quasi uguale, non esiste però una colonna "parent_id". Al suo posto, una colonna chiamata "path" di tipo varchar:


Ed ecco il confronto tra il metodo usato nella precedente lezione, il classico con liste di adiacenza, ed il nuovo con enumerazione di percorsi:

Questo nuvo metodo memorizza l'intero percorso come campo del record, rendendo cosi semplicissime le operazioni di estrazione degli alberi.


Andiamo ad esempio ad estrarre tutti i "genitori" del girone B della lega Pro:
SELECT *
FROM categorie
WHERE '1/3/6/8/' LIKE concat(path,'%');

Il risultato è formidabile, con una sola query abbiamo a disposizione tutto l'albero:



questo significa che possiamo usare le varie funzioni di aggregazione sum(), count() ecc e disporre facilmente dei relativi risultati. Di solito questo tipo di funzioni vengono usate con le rubriche principali, per cui è ad esempio sufficiente una like base per sapere quante sono le categorie che parlano di calcio:
SELECT count(*)
FROM categorie
WHERE path like "1/%";

L'altra faccia della medaglia di questo metodo è nel fatto che l'albero va dichiarato esplicitamente, per cui l'integrità dei dati è delegata alla nostra applicazione. L'aggiunta di una nuova categoria è semplice ma non immediata (necessita di un aggiornamento con mysql_insert_id() per l'ultimo nodo); più complicata l'eliminazione di un nodo intermedio.
Inoltre il campo varchar, sia pur molto ampio, potrebbe generare problemi di lunghezza per quei casi in cui sono presenti molto nodi, i cui id sono magari molto elevati. Di contro l'utilizzo di campi testuali più elevati rende più complessa l'aggiunta di indici; di solito questi campi necessitano di ottime prestazioni.
Si tratta comunque di una soluzione molto valida, usata non a caso da Magento nella tabella di gestione delle categorie (catalog_category_entity).