Bằng cách thêm cột đường dẫn và trình kích hoạt, điều này có thể được thực hiện khá dễ dàng.
Đầu tiên, hãy thêm một cột varchar sẽ chứa đường dẫn từ gốc đến nút:
ALTER TABLE category ADD path VARCHAR(50) NULL;
Sau đó, thêm một trình kích hoạt tính toán đường dẫn trên insert:
(chỉ cần nối id mới với đường dẫn của cha mẹ)
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);
Sau đó, chỉ cần chọn đặt hàng theo đường dẫn:
SELECT name, path FROM category ORDER BY path;
Kết quả:
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
Xem fiddle .
Bằng cách này, chi phí bảo trì cũng là tối thiểu. Trường đường dẫn bị ẩn khi chèn và được tính toán thông qua trình kích hoạt. Việc xóa một nút không có chi phí chung, vì tất cả các nút con của nút cũng bị xóa. Vấn đề duy nhất là khi cập nhật parent_id của một nút; Chà, đừng làm vậy! :)