Управлять результатами сортировки с учетом предпочтений пользователя - база данных - PullRequest
2 голосов
/ 22 июня 2011

Предположим, у нас есть простая база данных, содержащая следующие данные:

        name
        apple
        pear
        banana
        grape

Пользователь хочет отсортировать эти фрукты по названию, и мы будем иметь, без удивления

         apple
         banana
         grape
         pear

Однако по какой-то причине пользователь хотел бы поместить pear в качестве 3-го фрукта, это означает, что он хотел бы иметь:

         apple
         banana
         pear
         grape

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

Как мы должны решить эту проблему? В довершение всего, мы могли бы добавить поле user_sort_id, которое будет обновляться, когда пользователь сортирует и манипулирует результатом сортировки, и мы будем использовать это поле как ключ сортировки.

                       init value       -> sort by name         ->place pear as the seconds
        name           user_sort_id 
        apple            0                     0                          0
        pear             1                     3                          2  
        banana           2                     1                          1  
        grape            3                     2                          3 

Этот подход должен работать в теории. Однако на практике я не могу придумать элегантного и быстрого оператора SQL, который мог бы этого достичь. Есть идеи или альтернативы?

1 Ответ

1 голос
/ 23 июня 2011

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

CREATE TABLE user_sort_order (
    name VARCHAR(?) NOT NULL REFERENCES your-other-table (name),
    user_id INTEGER NOT NULL REFERENCES users (user_id),
    sort_order INTEGER NOT NULL                -- Could be float or decimal
);

Тогда заказывать легко.

SELECT name 
FROM user_sort_order
WHERE user_id = ?
ORDER BY sort_order

Нет волшебной палочки для обновления.

  • Удалить все строки пользователя и вставить строки с новым порядком. (Грубая сила всегда работает.)
  • Обновить каждую строку новым порядком. (Может быть много операторов UPDATE.)
  • Отслеживайте изменения в вашем приложении и обновляйте только измененные строки и строки, которые должны быть "ударены" изменениями. (Экономно, но подвержено ошибкам.)
  • Не позволяйте пользователям навязывать свой порядок сортировки. (Обычно идея не такая плохая, как кажется.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...