Dengan menambahkan kolom jalur dan pemicu, ini dapat dilakukan dengan cukup mudah.
Pertama tambahkan kolom varchar yang akan berisi jalur dari root ke node:
ALTER TABLE category ADD path VARCHAR(50) NULL;
Kemudian tambahkan pemicu yang menghitung jalur saat penyisipan:
(cukup gabungkan id baru dengan jalur induk)
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);
Kemudian cukup pilih order by path:
SELECT name, path FROM category ORDER BY path;
Hasil:
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
Lihat biola .
Dengan cara ini biaya perawatan juga minimal. Bidang jalur disembunyikan saat memasukkan dan dihitung melalui pemicu. Menghapus sebuah node tidak memiliki overhead, karena semua anak dari node juga dihapus. Satu-satunya masalah adalah ketika memperbarui parent_id dari sebuah node; Yah, jangan lakukan itu! :)