Разрешить пользователю сортировать записи? - PullRequest
4 голосов
/ 24 января 2009

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

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

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

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

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

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

Ответы [ 6 ]

3 голосов
/ 24 января 2009

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

Установить начальные позиции как 0.0, 1.0 и т. Д.

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

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


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

1 голос
/ 24 января 2009

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

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

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

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

0 голосов
/ 24 января 2009

Вы можете смотреть на это как на группы друзей.

Изначально все находятся в группе 0, и порядок по имени или что-то в этом роде.
- Если пользователь затем увеличивает «Группу» друзей (а) до 1, то они переходят наверх
- Если пользователь затем увеличивает «Группу» друга (b) до 1, то (a) и (b) появляются вверху
- Если пользователь затем снова увеличивает «Группу» друга (b), то (b) появляется 1-е и (a) 2-е

Всего лишь тысяча ...

0 голосов
/ 24 января 2009

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

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

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

0 голосов
/ 24 января 2009

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

0 голосов
/ 24 января 2009

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

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