php – 项目排名,使用Reddit排名算法自信地排序

我有兴趣使用这个 ranking class,基于 Evan Miller的一篇文章来排名我有一个有upVotes和downVotes的表.我有一个非常类似Stack Overflow的上/下投票系统的系统,用于我正在处理的事件站点,通过使用这个排名类,我觉得结果会更准确.我的问题是如何通过功能’hotness’订购?
private function _hotness($upVotes = 0,$downVotes = 0,$posted = 0) {
    $s = $this->_score($upVotes,$downVotes);
    $order = log(max(abs($s),1),10);

    if($s > 0) {
        $sign = 1;
    } elseif($s < 0) {
        $sign = -1;
    } else {
        $sign = 0;
    }

    $seconds = $posted - 1134028003;

    return round($order + (($sign * $seconds)/45000),7);
}

我想每次用户投票我都可以在我的表中有一个列,其中包含为新投票重新计算的热度数据,并按主页上的该列排序.但我有兴趣在运行中加入上述功能,我不确定这是否可行.

来自Evan Miller,他使用:

SELECT widget_id,((positive + 1.9208) / (positive + negative) - 
                   1.96 * SQRT((positive * negative) / (positive + negative) + 0.9604) / 
                          (positive + negative)) / (1 + 3.8416 / (positive + negative)) 
       AS ci_lower_bound FROM widgets WHERE positive + negative > 0 
       ORDER BY ci_lower_bound DESC;

但我宁愿不在sql中进行这个计算,因为我觉得这很麻烦,如果我在多个页面上使用这个代码就很难改变.

你是对的,像这样的查询相当混乱和昂贵.

混合使用PHP / MysqL一个坏主意,因为您必须为所有帖子选择值并计算热度,然后选择最热门的列表.非常昂贵.

您应该考虑将至少部分计算保存到数据库中.绝对订单应该去数据库.计算某些内容总是更好,每次保存/更新只保存一次,而不是计算每次显示时间.尝试通过计算保存/更新的顺序而不是每次计算热度来对保存时间进行基准测试.好的是订单永远不会改变,除非有人支持/ downVotes你保存到数据库无论如何,同样的标志.

即使您将符号保存到数据库,由于发布的timestamp参数,您仍然无法避免动态计算.

我会看到它有什么区别,它会产生什么不同,并且每隔x个时间用CLI脚本来计算热度,这对于那些至关重要的脚本来说,每隔一段时间它就会减少差异.

采用这种方法,您将只在必要时重新计算热度.这将使您的应用程序更加高效.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...