Каков наилучший способ хранения порядка сортировки в SQL?

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

Теперь, если нам нужно вставить элемент (id 5) после id 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
---+-----
...
---+-----

Ответ 3

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

Ответ 4

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

Ответ 5

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

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