Genom att lägga till en sökvägskolumn och en utlösare kan detta göras ganska enkelt.
Lägg först till en varchar-kolumn som kommer att innehålla sökvägen från roten till noden:
ALTER TABLE category ADD path VARCHAR(50) NULL;
Lägg sedan till en trigger som beräknar sökvägen vid infogning:
(sammanfogar helt enkelt det nya id:t med sökvägen till föräldern)
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);
Välj sedan helt enkelt order by path:
SELECT name, path FROM category ORDER BY path;
Resultat:
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
Se fiol .
På så sätt är underhållskostnaderna också minimala. Sökvägsfältet är dolt vid infogning och beräknas via trigger. Att ta bort en nod har ingen overhead, eftersom alla barn i noden också tas bort. Det enda problemet är när man uppdaterar parent_id för en nod; Tja, gör inte det! :)