Порядок записей в таблице (сортировка)

DeltaDIM

Новичок
Порядок записей в таблице (сортировка)

Доброго времени суток!
Пишу скрипт наподобие дерева каталогов (для CMS).
Столкнулся с проблемой изменения порядка записей.

Приведу пример:
имеется таблица

|name| |parent| |pos|
index 0 1
about 0 2
soft 0 3
contacts 0 4

soft1 soft 1
soft2 soft 2

phone contacts 1
adress contacts 2


Встает вопрос о добавлении\удалении\перемещении вверх,вниз\изменении родителя

Допустим если я хочу добавить страницу в раздел soft (запись должна иметь последнюю позицию) я высчитываю самую большую позицию (2) и прибавляю 1. Все нормально.

|name| |parent| |pos|
index 0 1
about 0 2
soft 0 3
contacts 0 4

soft1 soft 1
soft2 soft 2
soft3 soft 3

phone contacts 1
adress contacts 2

Теперь если я хочу удалить страницу (например soft2). Удаляем записть и уменьшаем на единицу все позиции, которые больше текущей (в нашем случае только soft3 меняем 3 на 2)

По перемещению записей вверх вниз: присваеваем позиции минимальное (1) или максимальное значение и оставшиеся записи (которые меньше\больше нашей прошлой позиции) увеличиваем\уменьшаем на единицу.

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

Одним словом, возможно это похоже на маразм)) И возможно это будет очень ресурсоемкий процесс... Ребят, если кто знает, подскажите, какие есть еще решения для организации такой сортировки.
 

wizard

Новичок
Re: Порядок записей в таблице (сортировка)

Автор оригинала: DeltaDIM
Теперь если я хочу удалить страницу (например soft2). Удаляем записть и уменьшаем на единицу все позиции, которые больше текущей (в нашем случае только soft3 меняем 3 на 2)
По перемещению записей вверх вниз: присваеваем позиции минимальное (1) или максимальное значение и оставшиеся записи (которые меньше\больше нашей прошлой позиции) увеличиваем\уменьшаем на единицу.
Проблема такого подхода в том, что если мы у какой-либо записи поменяем родителя, то весьма трудно будет это отследить и выставить правильные позиции.
У тебя id ведь есть в таблице? Вот при добавлении записи, ставь позицию равной добавленному id. И не парься со своими высчитываниями. :)
 

DeltaDIM

Новичок
wizard

а как тогда перемещать записть на одну позицию вверх\вниз если цифры будут не последовательны?
 

wizard

Новичок
Селект верхнего или нижнего соседа перемещаемой записи+два апдейта если есть сосед :)
 

Dovg

Продвинутый новичок
2DeltaDIM
Вроде как каноническая структура
id (autoinc) | parent id | name |sort

parent привязывай к id
сортируй по sort

и никаких проблем при удалении/добавлении
 
Сверху