如何排序像黑客新闻

bob*_*byh 6 mysql database database-design

我正在尝试编写一个插件来bbPress(开源论坛软件),它的工作方式类似于Hacker News(http://news.ycombinator.com/).

具体来说,我想使用以下算法对论坛 - 线程(bbPress称之为"主题")的顺序进行排序:

sort_value = (p - 1) / (t + 2)^1.5
where p = total votes for each topic from users
t = time since submission of each topic in hours
Run Code Online (Sandbox Code Playgroud)

我希望能够使用MySQL通过这个计算的sort_value对主题进行排序.

topics表中的相关字段如下所示:

topic_id            bigint(20)
topic_start_time    datetime
Run Code Online (Sandbox Code Playgroud)

这是悬而未决,但我认为将有另一个表存储用户的个人投票,因此我们将能够知道用户是否已经投票.另一个表格将存储每个主题的当前投票总数.也许该表中会有另一个字段存储最新计算的sort_Value?

为了100%准确,每次新投票后都应更新sort_value .但是,这会给数据库服务器增加太多负载,特别是如果我们尝试更新所有主题.如果必须,我们可以通过仅计算最后X#个主题的sort_value来限制数据集.我们还可以通过仅定期更新sort_value来限制负载(例如,通过cron作业每5分钟更新一次).

这些快捷方式可能会使负载可以接受,但我更喜欢更优雅的解决方案.

你会如何构建这个?:-)

bob*_*byh 0

好吧,这是我的想法。我将首先创建一个old_table包含 X 行带有 sort_value 字段的主题。

我想避免在单个表上出现大量 UPDATE 语句,因此我会定期用新计算的表替换旧表。据我所知,MySQL 不支持“替换表”语法,因此每隔 Y 分钟,我将通过 cron 创建该表的更新版本,名为new_sort_value. 然后我将执行以下命令序列:

  • 降低old_table
  • 重命名new_tableold_table

这看起来是一个有效的方法吗?