Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прибавить /отнять число ко всем веткам дерева, Восходящая по уровню процедура 
:(
    Опции темы
fridkaratel
Дата 11.12.2010, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



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

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
PM   Вверх
skyboy
Дата 11.12.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



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

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

Добавлено через 24 секунды
"рациональнее" не получится. структура хранения данных не позволяет.
PM MAIL   Вверх
fridkaratel
Дата 11.12.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



@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));?>


Это сообщение отредактировал(а) fridkaratel - 11.12.2010, 19:25
PM   Вверх
skyboy
Дата 12.12.2010, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Код

WHERE parents LIKE "3.15.27.32.%"

вот это - "все потомки узла". при наличии индекса на это поле, может, и не будет сильно тормозить.
PM MAIL   Вверх
fridkaratel
Дата 15.12.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Получается, сделать вторым вариантом?
И добавить индекс по столбцу Parents...?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.