Многомерные деревья (сново)

WMix

герр M:)ller
Партнер клуба
Многомерные деревья (сново)

приветы
Теперь проблема "Многомерных деревьев" коснулась и меня

поискал кроме phpDBtree ничего не нашёл

:::::К ЧТЕНИЮ НЕ ОБЯЗАТЕЛЬНО:::::
[ЦВЕТОМ=royalblue]
phpDBtree
-------------------------------------------------------------
если понял правильно то структура базы такая
что при добавлении ещё одного элемента придётся
менять и другие строки

те. мы имеем

элемент 1 [1] [10]
|
+ - элемент 2 [2] [7]
| |
| + - элемент 3 [3] [4]
| + - элемент 4 [5] [6]
|
+ - элемент 5 [8] [9]

чтоб вставить под элемент 4 скажем элемент 4.1
придётся изменить по крайней мере
элемент 2 [2] [7]
элемент 5 [8] [9]
элемент 1 [1] [10]
новое дерево

элемент 1 [1] [12]
|
+ - элемент 2 [2] [9]
| |
| + - элемент 3 [3] [4]
| + - элемент 4 [5] [8]
| |
| + - элемент 4.1 [6] [7]
|
+ - элемент 5 [10] [11]

правильно?
-------------------------------------------------------------------------
[/ЦВЕТОМ]
если да
мне не подходит

:::::ПРОДОЛЖЕНИЕ::::::

я думаю так удобнее базу сформировать
(имя, ключ, пренодлежность к ключу)
элемент 1 [1] [0]
|
+ - элемент 2 [2] [1]
| |
| + - элемент 3 [3] [2]
| + - элемент 4 [4] [2]
|
+ - элемент 5 [5] [1]

но вот тут проблемма пройти это дерево

PHP:
function by_node($arr1,$arr2)
{
	return ($arr1["id"]>$arr2["parent_id"])?1:-1;
}
$tree=$db->GetRows("SELECT * FROM ".$DB_TAB_KEY."cat");// получаем все данные дерева в виде $tree[row][col]
usort($tree,by_node); // пересиртировываем

...
неработает :(
во время думак такие алгоритмы выстраиваются с внутреннем циклом , двумя счетчиками жуть
-----------------------------------------------------------------------------

Кто сталкивался может поделится алгоритмом для сортировкиф
 

WMix

герр M:)ller
Партнер клуба
если кто ответит я в 10:00 по нашему посмотрю
спасибо
пошёл работать
 

su1d

Старожил PHPClubа
если да
мне не подходит
да, но чем же тебе не подходит стандартный проверенный алгоритм, и ты решил снова изобретать велосипед? =)

думаешь, что долго работать будет? у меня есть форум, сделанный на Nested Sets, где сейчас уже около 30 тыс. постов. не тормозит совершенно.
 

WMix

герр M:)ller
Партнер клуба
ты хочеш сказать что изменение 30 000 строк это быстро (я поверю)(если я не ошибаюсь это SQL алгоритм)

но всётаки к каталогу присоеденены куча других таблиц
и заменять там ключи ммм...
----------------------------------------------------------------------------
Моя структура не нова (не велосипед) я откуда-то её взял
вспомнить бы :)

а кроме Nested Sets - алгоритма (если это алгоритм) есть что нибудь

да 100 пудов кто-то сталкивался
 

WMix

герр M:)ller
Партнер клуба
и я об этом "но есть есть"
пример

кто-то поднял из архива топик и все давай обсуждать его
и попер бобёр
 

Crazy

Developer
Автор оригинала: WMix
и я об этом "но есть есть"
Но редко. Вывод: в тех местах, где вставка стоит дороже, нужно оставлять большее пространство для расширения без вставки. Т.е. в начала "дыр" ставить больше, ближе к концу -- меньше.
 

WMix

герр M:)ller
Партнер клуба
Но редко. Вывод: в тех местах, где вставка стоит дороже, нужно оставлять большее пространство для расширения без вставки. Т.е. в начала "дыр" ставить больше, ближе к концу -- меньше.
это своего рода патч для бага(АБСТРАКЦИЯ)

10 различных форумов и одна таблица
каждый вышестоящий форум меняет ключи нижестоящих
или должны быть различные таблицы
...............................................................................................
я согласен PhpTree удобно использовать где инфа больше читается скажем каталоги

но в моём случии это не годится полностью
или дыры остовлять надо везде
 

Crazy

Developer
Автор оригинала: WMix
это своего рода патч для бага(АБСТРАКЦИЯ)
Не вижу здесь бага. Оптимизация и устранение багов -- суть разные вещи...

10 различных форумов и одна таблица
каждый вышестоящий форум меняет ключи нижестоящих
или должны быть различные таблицы
Прости, но ЗАЧЕМ ты сливаешь все форумы в ОДНО дерево? Достаточно завести отдельный ID форума как часть первичного ключа и твой БАГ исчезает.
 

Rynor

stay hungry
мне тоже не нравится
phpDBtree
буду смотреть
Ultra
свое лень писать, и так 2 дня читаю про b-trees, голова гудит уже :)))
опа
посмотрел код Ultra, у меня в принципе так же .... :)))
ну мона спать спокойна
 

WMix

герр M:)ller
Партнер клуба
Прости, но ЗАЧЕМ ты сливаешь все форумы в ОДНО дерево? Достаточно завести отдельный ID форума как часть первичного ключа и твой БАГ исчезает.
в данном случии так надо
БАГ это я АБСТРАКТНО назвал

хотя я уже начинаю склонятся к идеи Nested Sets
подумать только одним запросом и ветвь и глубина

ну а всётаки раз резговор о деревьях какие ещё бывают?

к примеру мне знаком такой алгоритм
Код:
001                         а
002                         б
002001                   с
002002                   д
003                         е
003001                   ф
003001001             г
.....
0zazbzASt...           xyz
--------------------------------------------
идея: ключ состоит из букв и цифр (3 символа гдето 63000 подэлеметтов)
можно 4символа сделать
ну и по ключу сортируй на длину по имени итд тоже вся инфа одним запросом с сортировкой

Crazy а ты знаеш что другое кроме этих 3 алгоритмов
или пользуюсь, работает и ничего не надо :)
 

Crazy

Developer
Описанный тобой алгоритм, как ни смешно, тоже одна из реализаций Nested Sets. :)
 

WMix

герр M:)ller
Партнер клуба
а что такое вообще Nested Sets
и Rynor про b-trees пишет я покопался а это вобще какаето часть баз так и не разобрался это что
 

Rynor

stay hungry
b-trees ну типа например мускуль на основе этого алгоритма индексами рулит... я в терминоглогию особо не лезу.... и так башка гудит от нее...
деревья и деревья :)
 

Макс

Старожил PHPClub
А разве дерево построеное по алгоритму b-trees не переписывается заново при вставке новых строк ? (если да, то у него такой же недостаток как и у nested sets)

Вообще-то тут как-то su1d писал, что при дерево лучше хранить в таблице типа: id, left, right, level
А остальные данные хранить в другой таблице, связаной с этой по id.
 

su1d

Старожил PHPClubа
Вообще-то тут как-то su1d писал, что при дерево лучше хранить в таблице типа: id, left, right, level
А остальные данные хранить в другой таблице, связаной с этой по id.
и сейчас так говорю.
структуру дерева надо держать отдельно от данных, в таблице с фиксированной длиной записи, и со всеми полями внутри индекса, чтобы MySQL даже не лез в файл с данными во время выборки на чтение (для этого надо ещё запросы грамотно составлять). такое глобальное индексирование увеличит время обновления индекса на изменении данных, но на таблице с четырьмя полями типа INT это всё равно будет очень быстро.

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

WMix

герр M:)ller
Партнер клуба
в таблице типа: id, left, right, level
а зачем left, right, level? // данные не повторяются?
как тема называлась? // я бы почитал
b-trees не переписывается заново при вставке новых строк
я незнаю b-trees но это вроде это кишки mysql а не алгоритм деревьев пхп
 
Сверху