Dodając kolumnę ścieżki i wyzwalacz, można to zrobić dość łatwo.
Najpierw dodaj kolumnę varchar, która będzie zawierać ścieżkę od korzenia do węzła:
ALTER TABLE category ADD path VARCHAR(50) NULL;
Następnie dodaj wyzwalacz, który oblicza ścieżkę podczas wstawiania:
(po prostu łączy nowy identyfikator ze ścieżką rodzica)
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);
Następnie po prostu wybierz kolejność według ścieżki:
SELECT name, path FROM category ORDER BY path;
Wynik:
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
Zobacz skrzypce .
W ten sposób koszty utrzymania również są minimalne. Pole ścieżki jest ukryte podczas wstawiania i jest obliczane przez wyzwalacz. Usunięcie węzła nie wiąże się z żadnym obciążeniem, ponieważ wszystkie dzieci węzła są również usuwane. Jedynym problemem jest aktualizacja parent_id węzła; Cóż, nie rób tego! :)