Есть задача хранить бинарное дерево (т.е. у каждого узла не более 2 потомков). Дерево может расти значительно. Точно сотни тысяч узлов, возможно и миллионы. Пользователь видит за один раз небольшой кусочек дерева, но проблема в том, что он должен при этом видеть сколько потомков имеет каждый узел дерева, который он видит.
Дмитрий, и при каждом добавлении ноды в дерево их пересчитывать? я боюсь, что это будет довольно затратная операция при разрастании дерева. пересчитывать-то придется с самого верха. или я не понял мысль?
Сергей Петров, Тогда вам в любом случае как бы вы ни хранили данные, придется пересчитывать их для каждого родительского узла без вариантов просто по логике вещей. Но вы можете это делать например не каждый раз, а периодически и показывать на странице не 10731 а '10700'', То есть округляя до сотен или десятков. Вряд ли пользователю каждый раз нужна точная цифра.
Владимир Коротенко, так оно непредсказуемо растет и ветвится. заранее его не построить. а если делать сразу "заготовку" пот 10 000 уровней, то никакой памяти не хватит с ним работать... :(
WITH RECURSIVE child_to_parents AS (
SELECT addrobj.* FROM addrobj
WHERE aoid = '51f21baa-c804-4737-9d5f-9da7a3bb1598'
UNION ALL
SELECT addrobj.* FROM addrobj, child_to_parents
WHERE addrobj.aoguid = child_to_parents.parentguid
AND addrobj.currstatus = 0
)
SELECT * FROM child_to_parents ORDER BY aolevel;
Владимир Коротенко, ну если по первому случаю, то мне вернется несколько миллионов записей. и их нужно будет обрабатывать.
А рекурсия работает, но в сравнении с nested sets проигрывает по времени значительно при возрастании количества уровней.
Сергей Петров, вроде как count(*) и есть выбор числа всех записей, чего уж тут думать то... А в плане удобства - задача слишком абстрактно описана, чтобы судить о верных методах и подходах. По мне так вряд ли вы что-то более оптимальное придумаете в описанных условиях.