Упорядочивание строк в зависимости от взаимодействия с пользователем - PullRequest
2 голосов
/ 05 марта 2010

Предположим, у меня есть таблица пользователей. Что-то вроде:

ID integer,
USER text,
POSITION integer

Мои кортежи БД могут быть:

(1, "user1", 1);
(2, "user2", 2);
(3, "user3", 3);

Мое приложение выводит список всех пользователей и имеет возможность изменить его порядок. Например: Вы можете заставить user3 идти перед user2.

(1, "user1", 1);
(2, "user2", 3);
(3, "user3", 2);

Также вы можете переместить кого-то на первое место. Например: если у вас есть ...

(1, "user1", 1);
(2, "user2", 2);
(3, "user3", 3);

... и вы перемещаете user3 на первое место, БД должно быть:

(1, "user1", 2);
(2, "user2", 3);
(3, "user3", 1);

Является ли использование столбца POSITION правильным подходом? Есть ли способ сделать это без слишком большого количества попаданий в БД?

Ответы [ 2 ]

2 голосов
/ 05 марта 2010

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

Одним небольшим улучшением является снятие ограничения на то, что позиции должны быть последовательными числами, начиная с 1. Вместо этого можно разрешить, чтобы позиции были 100, 200, 300 и использовать ORDER BY, чтобы получить строки в правильном порядке. Таким образом, можно вставить новый элемент между двумя существующими элементами без необходимости изменять какие-либо другие элементы, по крайней мере до тех пор, пока в вашей последовательности не закончатся пробелы и вам не потребуется «дефрагментировать» ее.

Но дополнительные усилия по внедрению этой системы, вероятно, не стоят того, на мой взгляд. Простое решение прекрасно работает для большинства целей.

2 голосов
/ 05 марта 2010

Использование столбца POSITION, как вы предлагаете, вполне допустимо. Количество чтений из БД будет зависеть от количества строк в таблице, какие индексы вы создаете.

Если вы имели в виду сохранение внесенных пользователем изменений обратно в БД, если не требуется много изменений, достаточно просто выдать оператор UPDATE.

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