Основанное на MySQL веб-приложение: простой способ для пользователей выбрать порядок или элементы?

Я работаю над тем, где пользователи могут переупорядочить элементы, и в дальнейшем эти элементы должны отображаться в выбранном порядке. В качестве простого примера рассмотрим список элементов:

A, B, C, D, E, F, G.
Таблица MySQL была бы простой: user_id, letter, sortnumber

Пользователю разрешено изменять порядок поэтапно. Они могут перемещать A до D, G в начало и т. Д. Кроме того, они могут добавлять и удалять элементы. Таким образом, они могут удалить C или добавить X. На каждом из этих шагов я отправляю данные на PHP, который будет обрабатывать его, и задавать элементы в MySQL.

Есть два пути, которые я вижу в этом:

  1. Каждый раз, когда они добавляют / удаляют / переупорядочивают что-то, отправляйте весь список на PHP, удаляйте все данные, которые они ранее имели там, и просто вставляете новый список. Проблема в том, что это много удалений / вставок каждый раз, когда они что-то делают. Они могут перемещать A до B, а затем внезапно я удаляю 7 записей и вставляю еще 7. С положительной стороны, это мертво просто.
  2. Каждый «ход», который они выполняют (например: добавление, удаление или переупорядочение), отправляет информацию для этого. EG, они переместили A после F и сказали мне «переместить A после F». Теперь мне нужно проверить, что A и F существуют в списке, тогда мне нужно уменьшить все «sortnumber» между A и F (включая F). Если они скажут «удалить Z», я должен найти его в списке, удалить его и уменьшить после него все sortnumbers записей.

Так что мне просто любопытно … кто-то должен был иметь дело с чем-то, что имеет порядок, и если да, то как вы это сделали?

Добавьте столбец «Последовательность» в таблицу – как число с плавающей запятой.

Когда элемент перемещается между Row-A и Row-B, его порядковый номер присваивается среднему числу этих соседних столбцов

Индекс столбца Последовательность:

Когда пользователь хочет сохранить новый порядок элементов, сравните новый порядок со старым заказом и произведите обновление только тех, у кого есть их sortnumber . Если они удаляют элемент, вам не нужно смещать смену sortnumber . Если вы отсортируете список с номером, отсутствующим в середине, он все равно будет в правильном порядке.

Окончательный порядок последовательности – это единственный вопрос. Если вы переместите шесть предметов вокруг, чтобы получить конкретный заказ, вам действительно не нужно заботиться о том, какая последовательность списка находится в точках между тем, как это было, когда вы начали, и каково это, когда вы закончите.

Добавьте и удалите элементы, не беспокоясь о порядке последовательности, а затем обновите элементы, чтобы установить значение последовательности, когда вы нажимаете кнопку с надписью «Сохранить сортировку».

Это дает вам два преимущества:

  • Это намного меньше накладных расходов при каждом изменении элемента, что также означает, что он будет быстрее.
  • Сложно установить последовательность – все, что вам нужно сделать, – это отправить список идентификаторов элементов в желаемом порядке, а затем перебрать его, обновив значение последовательности, начиная с 0 и вверх.

Вот тот же ответ, который я дал вопросу Томашафа:

Это непростая задача. Если у вас есть небольшое количество сортируемых элементов, я бы просто сбросил все их в новый порядок.

В противном случае, похоже, потребуется столько же работы, сколько «тест-и-установка», чтобы изменить только те записи, которые были изменены.

Вы можете делегировать эту работу на стороне клиента. Попросите клиента сохранить порядок старого порядка и порядок сортировки и определить, какая строка [порядок сортировки] должна быть обновлена, а затем передает эти кортежи в интерфейс PHP-mySQL.

Вы можете улучшить этот метод следующим образом ( не требует поплавков):

  1. Если все отсортированные элементы в списке инициализируются порядком сортировки в соответствии с их позицией в списке, задайте для сортировки каждого элемента что-то вроде строки [sort-order] = row [sort-order * K], где K это некоторое число> среднее число раз, когда вы ожидаете, что список будет переупорядочен. O (N), N = количество элементов, но увеличивает пропускную способность по крайней мере на N * K с по меньшей мере K открытыми слотами между каждой выходящей парой элементов.

  2. Затем, если вы хотите вставить элемент между двумя другими, это так же просто, как изменить его порядок сортировки, чтобы быть тем, что есть> нижний элемент и <верхний. Если между элементами нет «комнаты», вы можете просто повторно применить алгоритм «распространения» (1), представленный в предыдущем абзаце. Чем больше K, тем реже будет применяться.

Алгоритм K будет выборочно применяться в скрипте PHP, а выбор нового порядка сортировки будет выполняться клиентом (возможно, Javascript).

Имейте первичный ключ и sortnumber для каждого элемента. Если у вас есть php-массив, содержащий первичные ключи, вы можете удалить элементы и вставить элементы в массив с помощью array_splice ().

// base array $items = array( 7, 11, 9, 4, 5); // remove item 11 array_splice($items, array_search(11), 1); // insert 11 before item 4 array_splice($items, array_search(4), 0, 11); // input now contains 7, 9, 11, 4, 5 

Затем цикл через массив и сортировку обновлений с помощью первичных ключей

 $i = 0; foreach($items as $item) { // UPDATE item_table SET sorting = '$i' WHERE id = '$item'; i++; } 

Просто добавьте еще один столбец. Позвоните по order .

У вас есть порядок строк, и каждая строка имеет идентификатор или первичный ключ. Просто просматривайте свои ряды по одному и задайте порядок, когда идете. Так:

 UPDATE item_table SET order = 0 WHERE id="fred"; UPDATE item_table SET order = 1 WHERE id="larry"; UPDATE item_table SET order = 2 WHERE id="john"; UPDATE item_table SET order = 3 WHERE id="sydney"; 

Я уверен, что есть математические способы обмана, но иногда простые ответы являются лучшими.

Затем, когда вы делаете запрос, добавьте SORT BY order .