Сохранение позиции ветки дерева.

white phoenix

Новичок
Сохранение позиции ветки дерева.

Есть дерево с полями:
`id` - auto_increment
`level` - уровень вложености
`value` - полезные данные
Например такие данные:
id level value
1 1 Ветка
2 2 Подветка
3 1 Category
4 2 Subcategory
5 1 Target
Выборка идет ORDER BY `id`.
Мы имеем три ветки первого уровня: "Ветка", "Category", "Target".
"Ветка" и "Category" имеют по одной подкатегории. Нам понадобилось сделать так чтобы "Target" было в другой позиции, например вначале, при этом id менять нельзя. Естественно нужно ввести еще одно поле, назовем его "pos". Что хранить в поле которое отвечает за позицию элемента? Я думаю что аналог id не подходит, т.к. к примеру у нас pos: 1, 2, 3, 4, 5. Нужно обменять местами 2 и 4 одним запросом. Можно конечно изначально писать в pos числа id*maxlevel и изменять позицию как нам нужно, но может есть более оптимальное и правильное решение? Скиньте пожалуйста ссылки где про это почитать.
Всем спасибо, и простите за глупый вопрос.
 

crocodile2u

http://vbolshov.org.ru
white phoenix
Я что-то не пойму: полей id и level тебе достаточно для хранения информации о дереве? Не поделишься алгоритмом?
 

white phoenix

Новичок
kvf77
Спасибо. Но, к сожалению, от столь заманчивой идеи хранения в двух таблицах придется отказаться.

-~{}~ 20.12.05 10:56:

crocodile2u
Еще поле "pos", которое отвечает за позицию.
 

crocodile2u

http://vbolshov.org.ru
white phoenix
и все равно не понимаю. ID родительского узла ты хранишь?
 

kvf77

Red Devil
crocodile2u

я так понял он делает это несколько извращенно и называет это pos
 

crocodile2u

http://vbolshov.org.ru
Нам понадобилось сделать так чтобы "Target" было в другой позиции, например вначале, при этом id менять нельзя. Естественно нужно ввести еще одно поле, назовем его "pos"
То есть до этого все работало безо всякого "pos".

white phoenix, маг и волшебник - как ты хранишь дерево?
 

white phoenix

Новичок
Я делаю вот такое меню - http://archont.ru/~white_phoenix/menu
crocodile2u
А зачем? Лишние (имхо) данные мне нужны :) Ведь зная `pos ` можно сказать чьим потомком является элемент. Изменяя `pos` и/или `level` можно двигать элемент куда угодно. Единственный недостаток это необходимость сортировки при каждой выборке, но у меня уже есть мысля как это обойти.
 

kvf77

Red Devil
white phoenix
а зачем делать через Ж когда есть давно отработаные способы и алгоритмы?
 

white phoenix

Новичок
crocodile2u
Я написал в первом посте, "Выборка идет ORDER BY `id`." По-моему всё понятно, самая примитивная реализация.

-~{}~ 20.12.05 11:12:

kvf77
Риторический вопрос...
 

crocodile2u

http://vbolshov.org.ru
Ни хрена не понял.

Вот дерево из твоего же поста:
1 1 Ветка
2 2 Подветка
3 1 Category
4 2 Subcategory
5 1 Target
Каким образом я узнаю, что "Subcategory" - это под-ветка "Category"??? Что конкретно мне на это указывает?

А как мне в такой структуре выбрать, допустим, всех детей выбранного узла? всех родителей? Всю под-ветку? Как узнать, есть ли у узла дети?
 

white phoenix

Новичок
crocodile2u
то что 4 > 3 и то что 2 > 1.
4 - id Subcategory
3 - id Category
2 - level Subcategory
1 - level Category
 

kvf77

Red Devil
white phoenix

нда.... а почему просто как все люди не хранить номер родителя и не париться таким образом?
 

white phoenix

Новичок
crocodile2u
> всех детей выбранного узла
Элементы у которых id > parentID, где parentID - заданный узел, и у которых level > parentlevel, где parentlevel - уровень заданого узла, при этом между ними не должно быть элементов с level <= parentlevel.

-~{}~ 20.12.05 11:24:

kvf77
Я и не парюсь совершенно, пока еще не решил буду ли хранить parentID, соображаю ту мыслю.
 

diamond_krnl

pure-php
можно 2 поля:
pos как int,
и sort как строка вида = sort(родителя) + pos(свой).

то есть вроде:
id|parent|pos|sort
1 |0 |2 |002
2 |2 |1 |002001
3 |2 |1 |002001
4 |0 |3 |003
5 |4 |1 |003001
6 |5 |1 |003001001
в итоге получается естесвеная сортировка дерева по полю sort.

а вообще лучше канечно nested sets, гемороя меньше с рекурсиями. :)
 

crocodile2u

http://vbolshov.org.ru
white phoenix
нет, ты мне SQL приведи - для следующих случаев:

А как мне в такой структуре выбрать, допустим, всех детей выбранного узла? всех родителей? Всю под-ветку? Как узнать, есть ли у узла дети?
 

kvf77

Red Devil
crocodile2u

ну че ты до него докопался? :) не видишь что алгоритм-то никакой - врядли ты выудишь из него суть генеальной идеи :)
 
Сверху