[Ответить в тред] Ответить в тред

02/12/16 - Конкурс визуальных новелл доски /ruvn/
15/11/16 - **НОВЫЙ ФУНКЦИОНАЛ** - Стикеры
09/10/16 - Открыта доска /int/ - International, давайте расскажем о ней!



Новые доски: /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • /int/ - International • /ruvn/ - Российские визуальные новеллы • /math/ - Математика • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 10 | 2 | 3
Назад Вниз Каталог Обновить

Даноны, есть один алгоритм ЕОА И этому алгоритму Аноним 19/12/16 Пнд 11:50:52  896981  
nestedsets3[1].gif (30Кб, 640x306)
Даноны, есть один алгоритм ЕОА
И этому алгоритму имя Nested set
Для чего он, я думаю знают многие, если не знают погуглите, для общего представления.

Но у меня конкретный вопрос, который уже проел мне мозг, т.к В большинстве случаев источников информации об этом алгоритме, написаны статьи, в которых нигде толком не указаны способы редактирования иерархии дерева, если и есть, то отведенный параграф для этой задачи описан крайне мутно,

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

Для перемещения одного узла в другой узел, без потомков, все куда проще, но когда дело доходит о перемещении ветки в ветку, вот тут начинается батхерт, лютый.

И так, анонамус, решим задачу здесь, и закрепим тред, по всем вопросам возникшим об таком алгоритме хранения деревьев в базах данных - sql как Nested set.

Для наглядности освящаю пик для понимания вложенных множеств
Аноним 20/12/16 Втр 12:04:42  897446
Анон доставляет. Надеюсь разберещся. Там нужно переписать часть кода, где юзается mysql. Мож на недели найдется время и я перепишу и выложу. Вообщем-то играйся.

https://gist.github.com/catsAND/f706356b50fe7a10b52219656b2725b8
Аноним 20/12/16 Втр 12:08:29  897448
>>897446
Благодарю, будь подписан на этот тред, буду задавать вопросы, разберём всё подробно, и хоть где-то будет нормальная статья об этом алгоритме во всем рунете
Аноним 20/12/16 Втр 14:38:32  897520
Я в гист комментарием добавил create базы, если что.
Аноним 21/12/16 Срд 08:50:37  897970
>>897520
Так весь код валидно работал?
Просто у меня сомнения по поводу метода moveBranch
а именно вот выражение:
$delta2 = $rgt - $node['LEFT'] + 1;
ведь получается отрицательное число, что в первом что во втором случае:
$delta2 = $rgt - $node['LEFT'] + 1 - $delta1;

По идее родительский $rgt будет ВСЕГДА меньше чем $node['LEFT'] если узел/ветка перемещается влево, может кто пояснить, что я не так понял?

Аноним 21/12/16 Срд 16:39:26  898179
Когда я его давно тестил - был валидный.

>ведь получается отрицательное число,
Почему отрицательное? Мы переносим ведь в родительской ветке. Right всегда больше чем left.
Аноним 21/12/16 Срд 22:15:30  898423
3weCt4nSQTE[1].jpg (39Кб, 607x336)
>>898179
Хорошо, ну вот смотри, красным выделена ветка которая перемещается, зеленым выделена ветка куда мы перемещаем красную

в приведенном примере кода который выше
>>897970 переменная $rgt это правая граница нового родителя, в данном случае на новом изображении я указал что зеленым выделен новый родитель, а красный, это перемещаемый, получается что

Конкретно в этом случае как на изображении этого поста $node['LEFT'] равен 9
А $rgt равен $rgt = $parent['RIGHT'] - 1; то есть 6
$delta2 = $rgt - $node['LEFT'] + 1;
6-9+1
вот про что я имею ввиду, результат будет отрицательным

Аноним 21/12/16 Срд 23:32:56  898464
>>898423
Да, теперь понял. Я с утра протестирую этот случай и отпишусь.
Аноним 21/12/16 Срд 23:40:41  898468
Погоди, а этот rgt же может быть отрицательным. И это значит что всем кто больше этого rgt, но меньше чем левая сторона переносимой ноды, мы обновляем правую и левую часть добавляя дельту. Или я щас уже чтото путаю?
Аноним 21/12/16 Срд 23:44:59  898471
>>898468
>И это значит что всем кто больше этого rgt
всем кто больше отрицательного числа?
Дельта2 это как раз те числа, которые в итоге должны либо уменьшить либо прибавить в зависимости от случая переноса в перемещаемой ветке
Аноним 21/12/16 Срд 23:46:04  898472
>>898468
потому что далее следует запрос
$this->DB->query("UPDATE `" . $this->table . "` SET `LEFT` = `LEFT` + ?i, `RIGHT` = `RIGHT` + ?i, `LEVEL` = `LEVEL` + ?i WHERE `ID` IN (?a)", $delta2, $delta2, $lvl_delta, $id_edit);

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 10 | 2 | 3
Назад Вверх Каталог Обновить

Топ тредов
Избранное