Очевидное (но дорогое) решение:
Я бы хотел сохранить рейтинг трека (1-10) в таблице, подобной этой:
TrackID
Vote
А потом простое
SELECT AVERAGE(Vote) FROM `table` where `TrackID` = some_val
для расчета среднего.
Однако меня беспокоит масштабируемость, тем более что она должна каждый раз пересчитываться.
Предлагаемое, но, возможно, глупое решение:
TrackID
Rating
NumberOfVotes
Каждый раз, когда кто-то голосует, Rating
обновляется
new_rating = ((old_rating * NumberOfVotes) + vote) / (NumberOfVotes + 1)
и сохраняется как новое Rating
значение TrackID
. Теперь, когда требуется Rating
, это простой поиск, а не расчет.
Ясно, что это не вычисляет среднее. Я пробовал несколько небольших наборов данных, и это приближает среднее значение. Я полагаю, что это может сходиться по мере увеличения набора данных? Но я боюсь, что это может расходиться!
Что вы, ребята, думаете? Спасибо!