2010-05-13 5 views
15

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

+1

Если только был программистом в доме ... –

ответ

12

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

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

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

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

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

+0

+1 для получения спецификации от конечного пользователя, но более подробно для объяснения –

+0

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

0

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

+7

Вам нужно периодически перестраивать их? Я предполагаю, что после нескольких сотен тысяч операций, полагаясь на точность fp, можно получить отрывочную информацию. – Anthony

0

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

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

1

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

+0

Что происходит, когда строки удаляются между ними и добавляются новые строки – msanjay

4

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

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

Давайте представим, что мы собираемся добавить пункт (ID 4) после того, как идентификатор 1:

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

Таким образом, чтобы вычислить значение сортировки для идентификатора 4 мы взяли значение сортировки элемента перед, который составляет 1000 , а предмет после - 2000 и принял среднее значение. Если вы получите float, просто округлите его до ближайшего целого. Если вам нужно вставить элемент в начале списка, вы берете среднее значение (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 
---+----- 
... 
---+-----