У меня есть следующая таблица SQL с данными
ProductList
id order productname
79 1 name1
42 2 name2
67 3 somename
88 4 othername
99 5 XYZ
66 6 ABC
Порядок дисплея очень энергозависим, он будет часто изменяться, пользователи добавят или удалят объекты и переупорядочат объекты.
Как я должен обработать эту ситуацию, не обновляя несколько записей. Пример: если пользователь вводит новый продукт между 1 и 2 порядками, я не хочу обновлять порядок всех записей под 2 и если кто-то переключает порядок 3 - 4, я не хочу обновлять каждую запись под 3.
Используйте «ужасный старый трюк, ставший знаменитым (?) Старыми кодировщиками BASIC - установите ваши заказы на 100, 200, 300, 400 и т. Д., А затем вы можете выбрать« промежуточный »порядок, когда вам нужно. Это может вызвать беспорядок - и если вы ожидаете большого переупорядочивания, я бы порекомендовал вам иметь запланированную задачу, чтобы время от времени «переупорядочивать» значения порядка для всей таблицы.
Добавьте столбец DATETIME с именем OrderDateTime. Используйте этот столбец (в порядке убывания) для устранения «связей» при упорядочивании и обновляйте его только при выполнении операции упорядочивания.
Например, в вашем примере предположим, что все строки имеют вчерашнее значение OrderDateTime.
Теперь, чтобы вставить элемент между 1 и 2, вы должны установить для него значение Order равным 2, а значение OrderDateTime равным now. Когда вы выбираете * FROM ProductList ORDER BY Order ASC, OrderDateTime DESC, новый элемент с номером 2 будет отсортирован перед существующим.
Точно так же, чтобы поменять местами элементы 4 и 5, вы должны обновить элемент 5, чтобы он имел порядок 4 и OrderDateTime сейчас. Он стал бы более свежим 4 предметом и появился бы раньше.
Вы должны быть внимательны, если вы попытаетесь вставить элемент между двумя другими элементами, которые уже имеют такое же значение Order, что вы разделите разницу значений OrderDateTime.
У вас есть два варианта:
. Нет никаких функций SQL, чтобы упростить это, и нет реального варианта, который был бы упрощен.
Вместо этого можно использовать связный список для упорядочивания (с каким-то особым способом определения головной части).
Вставки - это один INSERT и один UPDATE. Удаление - это один DELETE и один UPDATE. Перемещение - это три UPDATE. (Разумеется, используйте транзакции, чтобы не сломать связный список)
.Вы можете использовать строку вместо числа с бесконечно большим количеством цифр. Если вы хотите вставить между "1" и "2", сделайте это "15".
Второй ответ на тот же вопрос:
Используйте поле DOUBLE для упорядочивания и разделения разницы между двумя значениями, между которыми вы хотите вставить. В любом стандартном бизнес-приложении я очень, очень сомневаюсь, что вы когда-нибудь приблизитесь к тому количеству вставок, при превышении которого вы не сможете устранить разницу в порядке сортировки.