从数据库中选择最受欢迎的地方的算法

时间:2010-04-25 02:48:35

标签: algorithm mysql popularity

我们有一个包含地方数据库的网站。对于每个地方,我们的用户都可以采取我们记录的以下操作之一:

  1. 查看 - 查看其个人资料
  2. 评分 - 按1-5星级评分
  3. 审核 - 审核
  4. 已完成 - 标记他们已经在那里
  5. 愿望清单 - 标记他们想要去那里
  6. 最喜欢的 - 标记这是他们最喜欢的一个
  7. 在我们的数据库表中,每个地方都包含上述每项操作的次数以及用户给出的平均评分。

    • 视图
    • 评分
    • AVG_RATING
    • 完成
    • 心愿
    • 喜爱

    我们希望能够使用上述信息生成顶级位置列表。理想情况下,我们希望能够使用相对简单的SQL查询生成此列表,而无需执行任何计划来计算其他字段或堆栈排名位置。话虽这么说,因为我们只有大约50,000个地方,我们可以运行夜间cron工作来计算一些字段,例如不同类别的排名,如果它会对我们的顶级位置的整体结果产生有意义的差异。

    如果你能就如何考虑将最好的地方冒泡到顶部,我们应该考虑哪些标准,我们应该更重要,并给出这些信息 - 建议MySQL查询需要看起来像为了选择前10名。

    有一点需要注意的是,目前我们并不关心一个受欢迎的地方的新近度 - 这意味着查看总体信息很好,而且最近的数据不需要加权更多。 / p>

    提前感谢您的帮助&咨询!

3 个答案:

答案 0 :(得分:12)

答案 1 :(得分:2)

喜欢的确切公式需要来自你,我们称之为f(x) 对于实际的实现,我会添加一个我将计算的popular_score字段,正如你在夜间cron作业中所说的,每行使用f(x)。

然后,这只是一个“通过popular_score desc从表顺序中选择地名”的情况。

好的 - 让我们试一试吧 popular_score =(最喜欢* 3 +已完成* 2 + WISHLIST)*评分*视图/ AVG_VIEWS_OF_ALL_PROFILES

答案 2 :(得分:1)

我对如何称量事物没有意见。

那就是说,为什么不直接在位置表中添加一个人气栏?突然之间,您的SQL查询非常简单。

当然,棘手的部分是弄清楚如何以及何时更新该值。但是,由于您要保存所有活动数据,因此始终可以从日志条目中重新生成流行度值。

这样,你可以快速查询“最受欢迎”的位置,如果你想改变计算流行度的方式,你可以随意这样做。

如果你很聪明,你可以设计一个足够简单的公式,以便实时跟踪受欢迎程度。例如,如果我们只关心平均评级,您可以仅用三个变量修改平均评级:当前平均评级,评估对象的次数以及新评级值。

当然,当您开始混合对象被查看,审阅,收藏等多少次时,事情变得更加复杂......但是您可能会发现您可以设计一种计算上足够便宜的方法,您可以更新几乎所有行动的整体受欢迎程度。