Теоретически более оптимально (но намного сложнее)
Если вы думаете об этом столбце как о порядке сортировки, а не как о точной позиции, у вас может быть какая-то стратегия с пробелами, нумерация будет равна 10, 20, 30. Затем, если вы хотите переместить 3-ю песню в первую положение, вы можете дать ему номер 5, или вы можете даже дать ему отрицательное число.
Проблема в том, что вам все равно нужно будет прочитать все данные, и реализация нумерации становится намного сложнее, потому что теперь вам нужно проверить, нужно ли вам ничего не обновлять, или все, или, может быть, просто часть списка.
Довольно просто (в основном то, что у вас есть сейчас)
Так что, будь я на вашем месте, я бы упростил задачу и просто обновил все, что нужно обновить. В конце концов, в списке воспроизведения не так много строк (даже если вы разрешите 1000 или более песен в списке воспроизведения), и если вы сделаете это массовое обновление, база данных сможет справиться с этим просто отлично. Вы можете сдвинуть все строки одновременно, а затем обновить одну строку до ее новой позиции. Таким образом, вам понадобятся только два оператора: 1 для вставки, обновления или удаления определенной песни и 1 для смещения всего или части списка, чтобы сохранить нумерацию после.
Очень просто (и, вероятно, все еще достаточно быстро)
В прошлом я реализовывал это еще более ленивым образом, где я сохранял порядок сортировки с пробелом, имеющий 2, 4, 6, 8 ... Затем, когда я хотел обновить или вставить в определенный положение, я мог бы просто использовать sortorder = position*2-1
для строки, чтобы вставить или обновить, или просто удалить любую строку:
update Song
set
SortOrder = :NewPosition*2-1
where
SortOrder = :OldPosition*2;
После этого я просто обновил все строки, чтобы снова исправить нумерацию, независимо от того, где была моя модификация, сгенерировав новую последовательность на основе порядка сортировки.
Это означало бы, что я делал избыточные обновления строк, которые уже были правильными, но это было действительно, действительно легко, все еще очень быстро (потому что базы данных хороши в подобных вещах), и это также имело некоторый эффект автоматического восстановления, потому что Весь список будет перенумерован каждый раз, исправляя ошибки прошлого.
Это зависит от вашей базы данных, как именно это реализовать. Я использовал Oracle, который был довольно хорош и генерировал такие последовательности. В MySQL это немного более громоздко, но все же не так сложно.