Подсчитать количество детей в дереве ограниченной глубины - PullRequest
0 голосов
/ 07 марта 2011

У меня есть древовидная структура в MySQL, использующая поле parent_id для каждого узла.Структура довольно большая, но всего около 8 уровней.У каждого узла также есть поле child_counter.

Я ищу эффективный способ подсчета (и обновления) числа дочерних элементов каждого узла (по дочерним элементам, включая детей и т. Д.), Предпочтительноне слишком много вызовов SQL.Я не ожидаю, что это будет очень быстро, достаточно хорошо.

Я надеюсь, что может быть какой-то способ сделать массовое обновление, так как алгоритм повторяется.

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Вот хорошая статья: Управление иерархическими данными в MySQL

В настоящее время вы используете Модель списка смежностей со столбцом дополнительного счетчика.Но на самом деле то, что вы пытаетесь получить из иерархических данных, выглядит так, что их можно смоделировать гораздо проще с помощью модели Nested Set Model .

1 голос
/ 07 марта 2011

Я реализовал нечто подобное раньше, но не совсем. Можете ли вы хранить целое число «глубина» на каждом узле, чтобы отмечать их глубину в дереве? Если это так, вы можете сделать это с 8 запросами, что при правильной индексации будет вполне разумным. Что-то вроде этого, я думаю (MySQL не пригодится). Вы бы запросили от самой низкой глубины (то есть 8) вверх: UPDATE Node SET child_counter = ((SELECT SUM(child_counter) FROM Node WHERE parent_id = id) + (SELECT COUNT(0) FROM Node WHERE parent_id = id)) WHERE depth = x

...