Каков наилучший способ реализовать поле ранга в базе данных?

0

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

id, memberid, trackid, rank

EDIT: Кажется, лучший способ сделать это - найти max для члена существующих рангов и добавить один...

Теги:
database-design

4 ответа

2
Лучший ответ

Похоже, вы хотите ранжировать вновь вставленный элемент автоматически внизу.

INSERT INTO Prefs (MemberId, TrackId, Rank)
   SELECT   @MemberID, @TrackID,
            MAX(ISNULL(Rank,0))+1
   FROM Prefs
   WHERE MemberId = @MemberID

Кроме: Почему бы не сохранить rank null до тех пор, пока пользователь фактически не даст каждому элементу значение ранга? Представьте пользователю все элементы и заполнив (или нет!) Ранг, а затем запустите оператор UPDATE для каждого элемента.

  • 1
    Это как рулетка. Какой из вопросов правильно понял! Не я, я начинаю думать. Был смущен его историей получения значения и добавления +1.
  • 0
    хм ... я не уверен, что автоинкремент будет работать в отношениях многих ко многим ... это таблица столярных изделий ... первоначально ранжирование их по первичному ключу будет работать, а затем мне придется скопировать эти значения в поле ранга, давая пользователю возможность переставить их ...
Показать ещё 1 комментарий
2

Как ваши пользователи будут оценивать треки? Будут ли они заказывать их один за другим в каком-то пользовательском интерфейсе?

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


ОБНОВЛЕНИЕ:

Если вы хотите, чтобы новая запись всегда занимала последнее место, вы могли просто получить MAX(rank) WHERE memberid = ?, а затем INSERT новую строку с rank + 1, как вы предложили в вопросе. Обертка всего в транзакции гарантирует atomicity.

  • 0
    Да, у них будет возможность сделать это, но во время вставки новой записи мне нужно, чтобы ранг был автоматическим и учитывал ранжирование существующих записей (для каждого пользователя)
  • 1
    @Mel: Как база данных должна вычислять ранг во время вставки? Должна ли новая запись автоматически становиться последней в рейтинге? Если это так, вы можете просто получить MAX(rank) WHERE memberid = ? и вставьте с рангом + 1, как вы предложили в вопросе. Завершение всего в транзакции гарантирует атомарность ... (Обновленный ответ с информацией в этом комментарии)
1

Сделать ранг автоматическое увеличение? Он будет просто увеличивать это поле каждый раз, когда вы вставляете. Как id.

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

  • 0
    Я хочу, чтобы оба ... во время вставки для него были автоматически, но потом, чтобы пользователи могли редактировать это ...
0

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

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

В качестве альтернативы вы можете использовать "select max (rank) из ранжирования, где memberid =?" введите запрос, чтобы база данных вычислила его для вас. Не самый эффективный, но для ITunes-подобной базы данных он, вероятно, будет управляемым (то есть, если количество песен * не слишком велико ".

  • 0
    Дрю, вы частично правы ... да, как я сказал Аарону, у пользователя будет возможность переназначить интерфейс, но во время вставки новой записи мне нужно, чтобы ранг был автоматическим, и учитывать рейтинг существующих записей (для каждого пользователя)
  • 0
    @ Мел Хорошо, иди отредактируй свой вопрос, проясни его, пожалуйста. Тогда кто-то соответствующим образом отрегулирует свой ответ, и мы сможем двигаться дальше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню