Ao adicionar uma coluna de caminho e um gatilho, isso pode ser feito com bastante facilidade.
Primeiro adicione uma coluna varchar que conterá o caminho da raiz para o nó:
ALTER TABLE category ADD path VARCHAR(50) NULL;
Em seguida, adicione um gatilho que calcule o caminho na inserção:
(simplesmente concatena o novo id com o caminho do pai)
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);
Em seguida, basta selecionar a ordem por caminho:
SELECT name, path FROM category ORDER BY path;
Resultado:
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
Veja violino .
Desta forma, o custo de manutenção também é mínimo. O campo de caminho fica oculto ao inserir e é calculado via trigger. A remoção de um nó não tem sobrecarga, pois todos os filhos do nó também são removidos. O único problema é ao atualizar o parent_id de um nó; Bem, não faça isso! :)