明显(但价格昂贵)的解决方案:
我想在一个表中存储一个轨道(1-10)的评级,如下所示:
TrackID
Vote
Run Code Online (Sandbox Code Playgroud)
然后一个简单的
SELECT AVERAGE(Vote) FROM `table` where `TrackID` = some_val
Run Code Online (Sandbox Code Playgroud)
计算平均值.
但是,我担心这方面的可扩展性,特别是因为每次都需要重新计算.
建议但可能是愚蠢的解决方案:
TrackID
Rating
NumberOfVotes
Run Code Online (Sandbox Code Playgroud)
每次有人投票,Rating都会更新
new_rating = ((old_rating * NumberOfVotes) + vote) / (NumberOfVotes + 1)
Run Code Online (Sandbox Code Playgroud)
并存储为TrackID新Rating值.现在每当Rating需要时,这是一个简单的查找,而不是计算.
显然,这不计算平均值.我尝试了一些小数据集,它近似于均值.我相信它会随着数据集的增加而收敛?但我担心它可能会分歧!
你们有什么感想?谢谢!
假设您具有无限的数值精度,则该计算会正确更新均值.在实践中,您可能使用整数类型,因此它不准确.
如何存储累积投票数和投票数?(即total=total+vote,numVotes=numVotes+1).这样,您可以通过将一个除以另一个来获得精确的平均值.
只有当您获得的票数超出您正在使用的数据类型的范围时,此方法才会中断.所以使用一个大数据类型(32位应该足够了,除非你期待约40亿票)!