Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Прибавить /отнять число ко всем веткам дерева


Автор: fridkaratel 11.12.2010, 18:08
В-общем, интересует такая задача... и хочется получить ответ от специалистов в этой области...

1. Есть дерево (не важно, что оно содержит)... Обычное и типичное дерево...
2. Каждый node дерева содержит количество входящих в него элементов
3. Элементов может быть, думаю, до 10 000, уровень вложенности, до 7000 (скорей всего).

Суть задачи:
При добавлении элемента автоматически увеличивать цифру с количеством элементов у всех его родителей...

В текущей БД:
1. Родители хранятся по типу "0.3.15.27.32.",
2. Дети выбираются по запросу LIKE "%.PID.%"
3. Принцип nested sets не используется, так как дерево часто подвергается изменениям

Как же наилучшим способом решить такую задачу?

Вижу вариант - делать просто:
Код
UPDATE `tree` SET ChildCount=ChildCount+1 WHERE Parents LIKE "%.PID.%"


Но думаю, есть какие-то другие и более рациональные решения smile

Автор: skyboy 11.12.2010, 19:12
Цитата(fridkaratel @  11.12.2010,  17:08 Найти цитируемый пост)
Вижу вариант - делать просто:

разве это не увеличит счетчик у всех детей вместо всех родителей?

Добавлено через 24 секунды
"рациональнее" не получится. структура хранения данных не позволяет.

Автор: fridkaratel 11.12.2010, 19:23
@skyboy:
Блин, точно smile Думал, нашёл решение...

Эх, а как по-другому можно?

А такой вариант?  smile 
Код
$Parents = substr($Parents, 2, -1);//Чтобы оставить "3.15.27.32"
$Parents = str_replace('.', ',', $Parents);//В БД можно заменить разделитель с точки на запятую, и тогда эту строку можно удалить

Код
UPDATE `tree` SET ChildCount=ChildCount+1 WHERE NodeId IN (<?=$Parents;?>) LIMIT <?=count(explode(',', $Parents));?>

Автор: skyboy 12.12.2010, 19:35
Код

WHERE parents LIKE "3.15.27.32.%"

вот это - "все потомки узла". при наличии индекса на это поле, может, и не будет сильно тормозить.

Автор: fridkaratel 15.12.2010, 16:42
Получается, сделать вторым вариантом?
И добавить индекс по столбцу Parents...?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)