如何排序像黑客新闻

时间:2009-06-04 00:01:51

标签: mysql database database-design

我正在尝试将一个插件编程为bbPress(开源论坛软件),该插件的工作方式类似于黑客新闻(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

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

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

topic_id            bigint(20)
topic_start_time    datetime

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

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

这些快捷方式可能会使负载变得可以接受,但我希望更优雅的解决方案能够更好地扩展。

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

2 个答案:

答案 0 :(得分:1)

在这方面需要考虑许多权衡因素。你已经在你的问题中暗示了他们。及时性和准确性与负荷和规模。

如果不需要及时性和准确性且系统经历高负荷的写入,则批量计算是减少负载和增加比例的最佳方法。

您必须仔细检查系统的使用情况,并确定需要优化的区域。优化写入与优化读取具有不同的约束。同样是数据的及时性或准确性。

确定哪些对您的应用程序最重要,并进行适当的权衡。

答案 1 :(得分:0)

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

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

  • DROP old_table
  • 重播new_tableold_table

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