Разрешить пользователю сортировать записи?

Я пытаюсь найти способ сортировки записей пользователем (и т. д. списком друзей).

Я хочу дать пользователю возможность переместить запись (друга) прямо в начало или конец списка или путем ввода числа (между).

Сначала я подумал о добавлении столбца с именем SortOrder (int) в таблицу со всеми друзьями пользователей и установил число, в соответствии с которым порядок отображения записей должен быть.

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

Все данные хранятся в базе данных MS SQL.

Надеюсь, у кого-нибудь есть волшебное решение для этого?

4 голоса | спросил MartinF 24 Jam1000000amSat, 24 Jan 2009 07:27:21 +030009 2009, 07:27:21

5 ответов


0

Используйте числа с плавающей точкой для столбца сортировки.

Установите начальные элементы как 0.0, 1.0 и т. д.

Для перехода наверх используйте мин -1.0. Двигаясь вниз, установите максимум + 1,0. Перемещение между двумя пунктами, установите (prev + next) /2.0

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


[edit] FWIW, эта проблема возвращалась мне несколько раз, поэтому вот способ, который делает примерно то же самое, но со строками .

ответил peterchen 24 Jpm1000000pmSat, 24 Jan 2009 18:27:20 +030009 2009, 18:27:20
0

Я бы не подумал, что они будут делать это достаточно часто, чтобы быть реальной проблемой, но, если вы беспокоитесь, воспользуйтесь трюком, который мы впервые применили к нашему БЕЙСИК-коду с давних времен.

Когда у BASIC были номера строк, мы просто набирали их 10, 20, 30 и т. д., так что если нам нужно было вставить число от 10 до 20, мы бы назвали его 15. Или, если бы 20 до 10, мы изменили бы номер на 5.

С 32-битным целочисленным столбцом у вас может быть 200 000 друзей с интервалом в 100, что более чем достаточно, чтобы переместить все вокруг, особенно если вы умны.

Вы можете периодически запускать задание очистки, чтобы изменить нумерацию друзей на 100, 200 и т. д. (что-то вроде дефрагментатора диска для вашей социальной сети). Не пытайтесь обнаружить это, просматривая номера друзей, используйте другое поле, устанавливая его в значение true, когда пользователь реорганизует своих друзей, и сбрасывая его при дефрагментации. Это будет более эффективным.

ответил paxdiablo 24 Jam1000000amSat, 24 Jan 2009 07:40:33 +030009 2009, 07:40:33
0

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

ответил Marc Charbonneau 24 Jam1000000amSat, 24 Jan 2009 07:34:36 +030009 2009, 07:34:36
0

Я не знаю о магии, но для перемещения вверх или вниз вы можете просто установить SortOrder на MIN /MAX (SortOrder) +/- 1. Кто сказал, что вершина должна быть 1 или 0?

ответил JohnOpincar 24 Jam1000000amSat, 24 Jan 2009 07:38:39 +030009 2009, 07:38:39
0

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

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

Не уверен, что есть более целесообразный способ сделать это ...

ответил Mike Sickler 24 Jam1000000amSat, 24 Jan 2009 07:38:48 +030009 2009, 07:38:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132