Рекурсия

mihail.zagoskin

Новичок
Доброго времени суток. Подскажите в какую сторону смотреть, имеется около 10т. записей пользователей, из этих пользователей нужно собрать древововидную структуру, кто, кого реферал. Сейчас я использую рекурсию, но при таком количестве записей очень долго обрабатывает все. Может как-то можно все оптимизировать все это?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Весьма информативно про "очень долго"
 

Вурдалак

Продвинутый новичок
10 тысяч — это незначительное количество записей по сегодняшним меркам. Будет достаточно просто сделать кеш (можно прямо всей структуры) и обновлять его в background-скриптах при регистрации нового пользователя.
 

mihail.zagoskin

Новичок
10 тысяч — это незначительное количество записей по сегодняшним меркам. Будет достаточно просто сделать кеш (можно прямо всей структуры) и обновлять его в background-скриптах при регистрации нового пользователя.
тоже думал об этом. Но структура строится из активированных, (это млм), и если несколько пользователей будут одновременно взаимодействовать с кешем, то все собьется.
 

fixxxer

К.О.
Партнер клуба
Тогда строить на лету вспомогательную структуру по принципу nested sets или подобным.
 

Вурдалак

Продвинутый новичок
тоже думал об этом. Но структура строится из активированных, (это млм), и если несколько пользователей будут одновременно взаимодействовать с кешем, то все собьется.
Что собьётся? Если ты будешь перестраивать кеш в фоновом режиме («по крону»), то перестроение не будет зависеть от действий самих пользователей.

В качестве кеша можно использовать и предложенный nested sets, только я бы советовал с нуля каждый раз строить (можно две таблицы держать, делать `RENAME TABLE tbl_background TO tbl, tbl TO tbl_background` в конце).
 

mihail.zagoskin

Новичок
Что собьётся? Если ты будешь перестраивать кеш в фоновом режиме («по крону»), то перестроение не будет зависеть от действий самих пользователей.

В качестве кеша можно использовать и предложенный nested sets, только я бы советовал с нуля каждый раз строить (можно две таблицы держать, делать `RENAME TABLE tbl_background TO tbl, tbl TO tbl_background` в конце).
ну смотрите, есть кеш , если четыре пользователя одновременно обращаются к нему, то все четыре могут получит одинакого куратора, можно либо, либо три.
Может конечно ошибаюсь.
 

Вурдалак

Продвинутый новичок
получит одинакого куратора, можно либо, либо три.
Ты решаешь уже явно какую-то другую задачу. Ты хотел дерево, тебе рассказали как его получить. Вопрос того сколько там реферер может иметь максимум рефералов (или что ты там имел в виду фразой «можно либо, либо три») — это другая проблема. И для этого дерево строить не нужно, если только речь не про всех зависимых рефералов.
 

mihail.zagoskin

Новичок
Ты решаешь уже явно какую-то другую задачу. Ты хотел дерево, тебе рассказали как его получить. Вопрос того сколько там реферер может иметь максимум рефералов (или что ты там имел в виду фразой «можно либо, либо три») — это другая проблема. И для этого дерево строить не нужно, если только речь не про всех зависимых рефералов.
Ну да, задача немного другая, мне нужно из этого дерева выбрать первого свободного и туда поставить человека, сверху вниз, и слева направо начиная именно от пригласителя отсчет.. Это работает хорошо. Но так как дерево строится очень долго, все тормозится, база бывает подвисает.
 

WMix

герр M:)ller
Партнер клуба
выбрать первого свободного и туда поставить человека, сверху вниз, и слева направо начиная именно от пригласителя отсчет
PHP:
$id = get("select id from tree where is_free and left > $inv_left and  right < $inv_right  order by left limit 1");
$tree->addChild($id);
нашли, добавили, дальше?
 
Последнее редактирование:

mihail.zagoskin

Новичок
PHP:
$id = get("select id from tree where is_free and left > $inv_left and  right < $inv_right  order by left limit 1");
$tree->addChild($id);
нашли, добавили, дальше?
Ну хорошо, используя nested sets, куда копать что бы для начала собрать все это из обычного древовидного массива. Что бы прописать левые, правые значения и т.п. Как вытащить, и как сформировать дерево это каждая вторая статья, а как пересобрать ничего интересного.
 

WMix

герр M:)ller
Партнер клуба
Как вытащить, и как сформировать дерево это каждая вторая статья, а как пересобрать ничего интересного.
ты такие наивные вопросы задаешь, откуда мне знать что там у тебя?
- подготовил библиотеку
- прописал команды и запросы
- протестил что все работает
- сменил старый код на новый
(отбрось что уже есть)
 

fixxxer

К.О.
Партнер клуба
Дай четкий пример того, что есть, и что надо получить. На массивах или вообще схематично. В твои МММ тут вникать никому неохота.
 

mihail.zagoskin

Новичок
ты такие наивные вопросы задаешь, откуда мне знать что там у тебя?
- подготовил библиотеку
- прописал команды и запросы
- протестил что все работает
- сменил старый код на новый
(отбрось что уже есть)
А зачем вам знать что у меня, я же просто спросил, как все пересчитать заново, что бы обновить все left и right. Я не прошу код, я прошу ссылку где можно почитать.)
 

mihail.zagoskin

Новичок
Дай четкий пример того, что есть, и что надо получить. На массивах или вообще схематично. В твои МММ тут вникать никому неохота.
МММ это легко, млм структуру сложнее)). Ну так я не прошу код, я и пришел в теорию, что подсказали как лучше реализовать и куда копать.
 
Сверху