Cпособы хранения деревьев в реляционной БД
Существует 4 основных способа хранения деревьев в реляционной БД:
Adjacency List
Matherialized Path - полный путь до узла хранится в виде строки типа 0035.0993.7324.1256 (т.е. узел верхнего уровня содержит строку 0035, узел второго уровня - строку 0035.0993 и т.д.)
Nested Set - для каждого узла хранятся 2 числа: левый и правый индексы. Причём левый индекс узла меньше левого индекса любого потомка этого узла, а правый индекс соответственно больше.
Closure Table - отдельно храним данные, отдельно иерархию.
Также есть комбинации этих способов.
Ссылки:
http://janiwanow.com/blog/closure-table-part-1/
http://janiwanow.com/blog/closure-table-part-2/
https://habrahabr.ru/post/193166/
http://www.php.su/articles/?cat=phpdb&page=013
https://www.opennet.ru/docs/RUS/hierarchical_data/
http://www.getinfo.ru/article610.html
https://habrahabr.ru/post/153861/
Есть готовые решения для фреймворков:
https://github.com/paulzi/yii2-adjacency-list
https://github.com/paulzi/yii2-nested-sets
http://sqlfiddle.com/#!2/7e58b/3
https://habrahabr.ru/post/266155/
https://github.com/dakujem/oliva-tree
https://github.com/pistol88/yii2-tree