Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
position, которое следует добавить в таблицу pages. От нуля и до бесконечности. В своей реализации я так и сделал.-level 1
--level 2
---level 3
----level 4
ancestor | descendant | level
------------------------------
1 1 0
2 2 0
3 3 0
4 4 0
------------------------------
1 2 1
2 3 1
3 4 1
------------------------------
1 3 2
2 4 2
------------------------------
1 4 3
level для уровня вложенности, которое при перестроении дерева всё равно надо будет обновлять. Или, к примеру, мы захотим удалить всю ветку комментариев или тех же страниц. От кастомного запроса, наподобие приведенных, в таком случае не уйти.parent, в уходе от рекурсии и большого количества join-ов. Обратите внимание, что любой из приведенных запросов использует всего лишь один join. И дерево по такой таблице связей строится достаточно легко.Если учесть что поле descendant скорее всего уникальное(из здравого смысла что у каждого узла в дереве всего один родитель),
напоминает Materialized Path вынесенный в отдельную таблицу
Кроме того, не подскажите, как в Nested Sets запросить только детей первого уровня, а не всё поддерево?
select c.leftKey, c.rightKey
from Tree c inner join Tree p
on c.leftKey between p.leftKey and p.rightKey
where
p.leftKey between $l and $r
and c.leftKey between $l and $r
group by c.leftKey, c.rightKey
having count(*) = 2
в Nested Sets запросить только детей первого уровня, а не всё поддерево?
INSERT INTO pages_treepath (ancestor, descendant)
SELECT ancestor, 12 FROM pages_treepath
WHERE descendant = 4
UNION ALL
SELECT 12, 12
Хранение деревьев в базе данных. Часть первая, теоретическая