Время от времени мне прилетают в почту занятные вопросы. Последний про хранение упорядоченного списка в базе данных.
Имеется возможность загрузки фото в альбомы. Нужно реализовать возможность упорядочивать фото в пределах альбома. Автор уже хранит порядок в поле order
, но его напрягает, что при перетаскивании какой-либо из картинок нужно обновлять order
у фотографий всего альбома.
Для начала, стоит оценить частоту изменений порядка фото. Если операция не очень частая и выполняется, например, только админом раз в день и в альбомах не очень много фото, можно смело хранить order
как integer
и обновлять, как автор и делает.
Если же операция достаточно частая, можно схитрить и хранить order
как decimal
. В этом случае при вставке или перемещении фото между двумя другими необходимо обновить только order
непосредственно перемещаемой записи.
Если мы перемещаем фото C
и засовываем его между фото A
и фото B
, то значение order
для него вычисляется как
C.order = A.order + (B.order - A.order) / 2;
UPD: из за ограничений точности следует проверять, влезет ли в базу очередное значение. Если нет — пересчитывать order
. Даже несмотря на то, что от пересчётов мы не избавились, их частота сократилась для худшего случая на порядок.