Каков наилучший способ сохранить порядок сортировки в SQL? - PullRequest
20 голосов
/ 13 мая 2010

Ребята наверху хотят, чтобы порядок сортировки настраивался в нашем приложении. Итак, у меня есть таблица, которая эффективно определяет тип данных. Каков наилучший способ сохранить наш порядок сортировки. Если бы я только что создал новый столбец под названием «Порядок» или что-то в этом роде, каждый раз, когда я обновлял порядок одной строки, я представлял, что мне придется обновлять порядок каждой строки, чтобы обеспечить потомство. Есть ли лучший способ сделать это?

Ответы [ 5 ]

13 голосов
/ 13 мая 2010

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

Если вам нужен пользовательский порядок сортировки, вам нужна соответствующая таблица для его хранения, а не дополнительное поле. Таблица будет иметь идентификатор пользователя, идентификатор записи данных и порядок сортировки записи. Таким образом, у Джо Смита может быть один заказ, а у Салли Джонс другой для тех же данных. Теперь у вас есть проблема с добавлением новых записей в набор данных. Помещаете ли вы их в начале порядка сортировки или в конце, или вам требуется, чтобы человек установил для них порядок, прежде чем они могут быть добавлены в набор. На самом деле это очень сложная проблема, которая, как правило, не стоит того времени, которое требуется для ее реализации, потому что почти никто никогда не использует эту систему, когда она будет установлена ​​(я имею в виду, действительно ли я хочу просмотреть сотню записей и отметить отдельного человека). порядок каждого?). Теперь это становится сложным с точки зрения сохранения порядка всех записей (что, конечно, потребует изменений при следующем запуске запроса, поскольку появятся новые записи.) Это очень болезненный процесс с ограниченным сроком действия.

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

Лучший выбор, если вы можете заставить их купить его, - это позволить им сортировать данные по столбцам (desc или asc). Обычно пользовательский интерфейс может быть спроектирован так, что если вы щелкнете по заголовку столбца, он будет обрабатывать данные по этому столбцу. Это относительно просто сделать и удовлетворяет большинству потребностей в индивидуальном заказе.

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

7 голосов
/ 05 октября 2016

Базовый алгоритм может быть похож на описанный ниже. Первоначально поле сортировки варьируется от элемента к элементу на 1000 (вы можете рассмотреть другой интервал). Элементы в таблице находятся в упорядоченном состоянии только для простоты. Кстати, я создал компонент Yii2 для управления этим материалом. И этот, если вам нужно сортируемое дерево сортируемое дерево .

id | sort
---+-----
1  | 1000
---+-----
2  | 2000
---+-----
3  | 3000
---+-----

Давайте представим, что мы собираемся добавить элемент (id 4) после id 1:

id | sort
---+-----
1  | 1000
---+-----
4  | 1500
---+-----
2  | 2000
---+-----
3  | 3000
---+-----

Таким образом, чтобы вычислить значение сортировки для идентификатора 4, мы взяли значение сортировки элемента, равное 1000 и пункт после - 2000 и взял среднее. Если вы получили число с плавающей запятой, просто округлите его до ближайшего целого числа. Если вам нужно вставить элемент в начале списка, вы берете среднее значение (1000 и 0, что равно 500).

Теперь, если нам нужно вставить элемент (идентификатор 5) после идентификатора 1, мы делаем то же самое:

id | sort
---+-----
1  | 1000
---+-----
5  | 1250
---+-----
4  | 1500
---+-----
2  | 2000
---+-----
3  | 3000
---+-----

Позже вы можете столкнуться с таким сценарием:

id | sort
---+-----
1  | 1000
---+-----
15 | 1001
---+-----
...
---+-----
5  | 1250
---+-----
...
---+-----

Так что, если вам нужно вставить элемент (id 16) между 1 и 15, сначала вы должны увеличить поле сортировки на 1000 всех элементов, а затем 1:

id | sort
---+-----
1  | 1000
---+-----
15 | 2001
---+-----
...
---+-----
5  | 2250
---+-----
...
---+-----

Теперь вы можете вставить элемент (id 16):

id | sort
---+-----
1  | 1000
---+-----
16 | 1501
---+-----
15 | 2001
---+-----
...
---+-----
5  | 2250
---+-----
...
---+-----
1 голос
/ 13 мая 2010

Используйте поле int. Когда вы обновляете порядок сортировки одной строки, вам нужно только обновить поле в строке, которую вы обновляете, и любые строки между старой и новой позициями строки. Это означает, что замена двух строк включает в себя только касание этих двух строк. Кроме того, для обновляемых строк, которые не являются вашей «активной» строкой, вам нужно только увеличить или уменьшить поле; запросы легко написать.

0 голосов
/ 13 мая 2010

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

Если необходимо иметь такие ордера, как B A Z T Q M K, то вам потребуется столбец для размещения относительного ордера. Соответствующее значение должно быть определено каждый раз, когда вы добавляете строку. Однако это хорошо работает для кодовых таблиц, которые относительно статичны.

0 голосов
/ 13 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...