Чрез добавяне на колона за път и тригер това може да се направи сравнително лесно.
Първо добавете колона varchar, която ще съдържа пътя от корена до възела:
ALTER TABLE category ADD path VARCHAR(50) NULL;
След това добавете тригер, който изчислява пътя при вмъкване:
(просто свързва новия идентификатор с пътя на родителя)
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);
След това просто изберете поръчка по път:
SELECT name, path FROM category ORDER BY path;
Резултат:
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
Вижте цигулка .
По този начин разходите за поддръжка също са минимални. Полето за път е скрито при вмъкване и се изчислява чрез тригер. Премахването на възел няма допълнителни разходи, тъй като всички деца на възела също се премахват. Единственият проблем е при актуализиране на parent_id на възел; Е, не правете това! :)