パス列とトリガーを追加することで、これをかなり簡単に行うことができます。
まず、ルートからノードへのパスを含むvarchar列を追加します。
ALTER TABLE category ADD path VARCHAR(50) NULL;
次に、挿入時にパスを計算するトリガーを追加します。
(単に新しいIDを親のパスと連結します)
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を更新するときです。まあ、それをしないでください! :)