Что касается базы данных, ваше решение с использованием поля заказа является правильным. Вы, вероятно, не хотите показывать это пользователю, и, используя пару стрелок вверх и вниз, ввод текста можно обойти. Когда пользователь нажимает стрелку «вверх», вы в основном переключаете конкретную запись с записью над ней. На мета-языке:
// $myId holds id of record, $myOrder holds the order of the record
SELECT id, order FROM t WHERE order < $myOrder LIMIT 1
// Store id in $nextId, order in $nextOrder
UPDATE t SET order = $nextOrder WHERE id = $myId
UPDATE t SET order = $myOrder WHERE id = $nextId
Обратите внимание, что это только очень грубый набросок, вам нужно будет добавить правильный выход. Кроме того, если вы хотите, чтобы индекс UNIQUE использовался для обеспечения строгого упорядочения, вам нужно изменить два последних оператора.