Door een padkolom en een trigger toe te voegen, kan dit vrij eenvoudig worden gedaan.
Voeg eerst een varchar-kolom toe die het pad van root naar het knooppunt bevat:
ALTER TABLE category ADD path VARCHAR(50) NULL;
Voeg vervolgens een trigger toe die het pad bij invoegen berekent:
(concat eenvoudig de nieuwe id met het pad van de ouder)
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);
Selecteer vervolgens eenvoudig volgorde op pad:
SELECT name, path FROM category ORDER BY path;
Resultaat:
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
Zie fiddle .
Op deze manier zijn de onderhoudskosten ook minimaal. Het padveld wordt verborgen bij het invoegen en wordt berekend via trigger. Het verwijderen van een knooppunt heeft geen overhead, aangezien alle kinderen van het knooppunt ook worden verwijderd. Het enige probleem is bij het updaten van de parent_id van een node; Nou, doe dat niet! :)