У меня есть коллекция объектов в базе данных. Изображения в фотогалерее, продукты в каталоге, главы в книге и т.д. Каждый объект представлен в виде строки. Я хочу иметь возможность произвольно упорядочивать эти изображения, сохраняя это упорядочение в базе данных, поэтому, когда я показываю объекты, они будут в правильном порядке.
Например, скажем, я пишу книгу, и каждая глава является объектом. Я пишу свою книгу и ставил главы в следующем порядке:
Введение, доступность, форма против функции, ошибки, согласованность, вывод, индекс
Он переходит к редактору и возвращается со следующим предложением:
Введение, форма, функция, доступность, последовательность, ошибки, вывод, индекс
Как я могу сохранить этот порядок в базе данных надежным, эффективным способом?
У меня были следующие идеи, но я не в восторге от любого из них:
- Массив
. Каждая строка имеет идентификатор заказа, когда заказ изменен (через удаление, за которым следует вставка), идентификаторы заказов обновляются. Это упрощает поиск, так как это просто
ORDER BY
, но, похоже, легко сломаться.// REMOVAL
UPDATE ... SET orderingID=NULL WHERE orderingID=removedID
UPDATE ... SET orderingID=orderingID-1 WHERE orderingID > removedID
// INSERTION
UPDATE ... SET orderingID=orderingID+1 WHERE orderingID > insertionID
UPDATE ... SET orderID=insertionID WHERE ID=addedID
-
Связанный список. Каждая строка имеет столбец для идентификатора следующей строки в упорядочении. Обход здесь кажется дорогостоящим, хотя можно каким-то образом использовать
ORDER BY
, о котором я не думаю. -
Разнесенный массив. Установите идентификатор orderingID (как используется в # 1) большим, поэтому первый объект равен 100, второй - 200 и т.д. Затем, когда происходит вставка, вы просто поместите его в
(objectBefore + objectAfter)/2
. Разумеется, иногда это нужно перебалансировать, поэтому у вас нет слишком близко друг к другу (даже с плавающей точкой, вы в конечном итоге столкнетесь с ошибками округления).
Ни один из них не кажется мне особенно изящным. У кого-нибудь есть лучший способ сделать это?