计算用户率等的最佳实践
我正在构建一个共享一些东西的应用程序...
每个可以评级的对象都有一个评级 1..5 开始。我为每个星星保留了每个星级的费率数量,以便可以计算平均费率。
因此,根据 Obj,我有:平均费率和总费率。 我需要获得排名前 10 的 Obj - 因此可以使用 AvgRate+TotalRate 来实现(那些将这些值设为 top10 的人)。
我想在服务器中有一个像这样的sql表: ObjId(索引)、totalRate、AvgRate... 是否可以对这个表进行排序,以便可以将 top10 作为前 10 个? 如何用我想要的计算方式查询top10?
另外 - 我需要获得每个用户的前 10 名。因此,对于每个用户,我拥有他共享的所有 Obj,因此可以拥有这些 Obj 的所有费率 - 以及前面提到的每个 Obj 的所有信息。
我需要知道如何计算用户率,以及如何快速进入前十名。
有什么想法吗?
I am building an application that shares some stuff...
Each Object can be rated has a rating 1..5 start. I keep for each the number of rates per star so can calculate the Avg rate.
So per Obj I have: Avg rate and total rate.
I need to get the top10 rated Obj - so can do it using AvgRate+TotalRate (those who has these values as top10).
I want to have in the server an sql table like this:
ObjId (index), totalRate, AvgRate...
If possible to have this table sorted so that can get the top10 as the first 10?
How can query the top10 with the calculation I want?
Also - I need to get the top10 per users. So per user I have all the Obj he shared so can have all of the rates of these Obj - with all info per Obj as mentioned before.
I need to know how to calculate a user rate, and also - how to fast get the top10.
Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
稍后编辑:抱歉,在写这个答案时不明白你的问题,还是留给其他人吧。
你的 TotalRate 公式是什么?你所说的“所以可以使用 AvgRate+TotalRate 来做到这一点”是什么意思 为什么你要将平均值与 TotalRate 相加 - 不管那是什么?
最佳实践是始终增量计算总和/平均值。
我将像这样对 Obj 进行建模:
当对象收到费率 X 时,您将重新计算A = A + 1,B = B + X,C = B/A。
以同样的方式预先计算总和/平均值。因此,如果 Obj 属于用户,则为 User 模型/表创建相同的字段(A、B、C),并且当 Obj 收到速率 X 时,还更新用户 D(Obj 的所有者)的 A、B、C 值。然后,当选择前 10 个用户时,您不需要加入 Obj 表(可能会变得很大),您只选择用户 - 按 B 或 C 列降序,限制 10。
Later Edit: Sorry, didn't understand your question when writing this answer, gonna leave it still for others..
What's your formula for TotalRate ? And what do you mean by "so can do it using AvgRate+TotalRate" Why are you summing an average to TotalRate - whatever that is?
Best practice is to always compute the sums/averages incrementally.
I would model Obj like this:
When object receives rate X, you then recompute A = A + 1, B = B + X, C = B/A.
In the same manner pre-compute aggregate sums/average. So if Obj belongs to user, create the same fields (A, B, C) to User model/table, and when Obj receives rate X, also update A, B, C values for user D (owner of Obj). Then, when selecting top 10 users, you do not need to join with Obj table (which may get huge), you only select users - descending by B or C column, limit 10.