acncii Bu kullandığınız yöntem Adjacency List olarak geçer. Veri eklemesi kolaydır fakat okuması ise zordur. Bunun yerine Nested Set yöntemini araştırmanızı öneririm. Nested Set'de ise veri eklemesi zordur fakat okuması kolaydır, parent_id değil de küme mantığı ile çalışır:
Her bir kaydın bir left (lft) ve bir de right (rgt) değer vardır. Bunlar eklenirken eklendikleri yere göre hesaplanırlar, tüm ağacın left right değerleri baştan hesaplanır ve değişir. Bu yüzden eklemesi zordur. Üstteki resimde eklenirken nasıl left right değerleri hesaplanmış onu gösteriyor. Elbette bunu kod ile ifade etmek kolay değil.
Okuması ise kolaydır. Mesela A burada kök. A'nın tüm çocuklarını almak için:
SELECT * FROM tree WHERE lft > 1 AND rgt < 16
yapabilirsiniz. Burada aslında bir küme işlemi yapıyorsunuz. Sol ve sağ değeri 1 ile 16 arasındaki kayıtları getir diyorsunuz. Resme bakarsanız A dışındaki bütün kayıtların left değeri 1 den büyük; right değeri 16'dan küçük. Mesela leaf denen en alttaki alt kategorilere bakalım. Bunlar D,E,G ve H. Bunları almak istersek:
SELECT * FROM tree WHERE lft = (rgt - 1)
Resme tekrar bakarsanız eğer D,E,G ve H bu dediğime uyuyor. D'nin right değeri 4; left değeri 3, yani left daima right değerinden 1 eksik.
Bunun gibi bir sürü konu var araştırmanız gereken. Hiyerarşik verinin veritabanında tutulması ve okunması ayrı bir alan diyebilirim.
Şunları inceleyebilirsiniz:
https://github.com/BlueM/Tree (PHP Adjacency List için kullandığım bir paket, gayet başarılı)
https://github.com/lazychaser/laravel-nestedset (Laravel'de Nested Set için kullandığım bir paket, gayet başarılı)
https://www.alberton.info/talks/show/id/1 (Güzel bir sunum)
https://en.wikipedia.org/wiki/Nested_set_model (Genel bilgi)
http://troels.arvin.dk/db/rdbms/links/#hierarchical (Konu ile ilgili bir çok link barındırıyor.)