Fors, да ... но тут есть свои ограничения ... можно только конечно число перестановок , которое варьируется взависимости от точности избраного типа данных decimal (float, double , big decimal) и от количества delta = (n, n-1),(n-1,n-2) , ... (k,k-1) , ... (n[1],n[0]) ... чем больше начальная дельта ... тем больше ... возможных перестановок в каждой дельте ... как вариант ... ввести некую критическую состовляющую ... при превышении которой идет полная переиндексация всех записей на основе текущей позиции каждого элемента.
Напрмер ... после определенного количества перестановок мы имеет.
Например, у нас есть
idx| value| pos
5 e 0.00001
3 c 0.00002
1 a 1.11564
4 d 3.12345
2 b 3.12346
Предел delta = 10^-5 ... то есть если будет проиходит еще перестановка в первых элементах, то будет борода. Из-за этого делаем проверку SQL ...
select min(position) as mPos from table
сравниваем mPos с нашим пределом ... если их разность бесконечно мала (в пределех 1 * 10^-5), то делаем перераздацу весов (переиндексирование). Напрмер с шагом в 10000 (в раельности на на децл порядком больше, но для простоты изложения обойдемся этим). Имеем ...
idx| value| pos
5 e 10000
3 c 20000
1 a 30000
4 d 40000
2 b 50000
И можено жить дальше.
Выйгрышь перед постоянной переиндексацией на лицо ... MIN в несравненно наименьшее число тактов (читать секунд) ... нежели полная переиндексация с обновлением в каждом перемещении.
NB! И еще первый possition не имеет право по определению быть 0 так как при перетаскивании на нулевую позиции ... значение предела этого индекса бесконечно стремиться к нулю.
ЗЫ! Надеюсь объяснил доходчиво...
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...