Aggiungendo una colonna di percorso e un trigger, questo può essere fatto abbastanza facilmente.
Per prima cosa aggiungi una colonna varchar che conterrà il percorso dalla radice al nodo:
ALTER TABLE category ADD path VARCHAR(50) NULL;
Quindi aggiungi un trigger che calcola il percorso all'inserimento:
(semplicemente concatena il nuovo id con il percorso del genitore)
CREATE TRIGGER set_path BEFORE INSERT ON category
FOR EACH ROW SET NEW.path =
CONCAT(IFNULL((select path from category where id = NEW.parent_id), '0'), '.', New.id);
Quindi seleziona semplicemente ordina per percorso:
SELECT name, path FROM category ORDER BY path;
Risultato:
pizza 0.1
piperoni 0.1.4
cheese 0.1.5
extra cheese 0.1.5.7
vegetariana 0.1.6
burger 0.2
coffee 0.3
Vedi violino .
In questo modo anche i costi di manutenzione sono minimi. Il campo del percorso è nascosto durante l'inserimento e viene calcolato tramite trigger. La rimozione di un nodo non comporta alcun sovraccarico, poiché vengono rimossi anche tutti i figli del nodo. L'unico problema è quando si aggiorna il parent_id di un nodo; Bene, non farlo! :)