Лучшая настройка базы данных MySQL для звездных рейтингов - PullRequest
2 голосов
/ 28 ноября 2011

У меня есть две таблицы.

Таблица A: Содержит список песен, обложки песен, ссылки на mp3, теги и т. Д.

Таблица B: Содержит информацию о зарегистрированном пользователе, идентификатор пользователя, имя пользователяи т. д.

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

Итак, мой план изначальнобыло создать третью таблицу и использовать JOIN:

Таблица C: Содержит songID, общий балл (сумма всех поданных голосов), voice_count (количество голосов) и выполнить расчет на стороне клиента в jQuery для возвратасредний голос.

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

Конечно, используя этот метод, я не буду защищен от голосования пользователей столько раз, сколькоони хотят.

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

Надеюсь, я ясно дал понять этот запрос, извините, если нет.

Ответы [ 4 ]

3 голосов
/ 28 ноября 2011

Составьте таблицу голосования: ([userID, songID], рейтинг)

Может быть, добавить индекс SongID для более быстрого доступа.

1 голос
/ 28 ноября 2011

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

vote table: ([userID, songID], rating)

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

1 голос
/ 28 ноября 2011

Попробуйте это:

  • Альбом |ID исполнителя, artwork
  • Художник |итоговый рейтинг
  • Песня |идентификатор исполнителя, альбом, рейтинг
  • Пользователи

Таким образом, вы можете выбрать по исполнителю, песне, альбому и т. д.

1 голос
/ 28 ноября 2011

Ваша третья таблица должна быть структурирована как:

Song ID
User ID
Star Rating

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

Чтобы вернуть средний рейтинг для данной песни, просто

select AVG(`Star Rating`) From `Rating Table` where `Song ID` = ?

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

...