如何像黑客新闻一样进行排序

6
我正在尝试编写一个插件,用于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

我希望能够使用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个回答

1

在这方面需要考虑一些权衡。你已经在问题中暗示了它们。及时性和准确性与负载和规模之间的平衡。

如果及时性和准确性不是必要的,而系统经历大量写入,则批处理计算是降低负载和增加规模的最佳方法。

您真的必须检查系统的使用情况,并确定需要优化哪些领域。针对写入进行优化具有不同的约束条件。对于数据的及时性或准确性也是如此。

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


0

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

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

  • DROP old_table
  • RENAME new_table to old_table

这个方法看起来可行吗?


我认为这是有效的,尽管有些笨拙。不幸的是,您正在处理所添加系统的限制。扩展此类问题正是关系型数据库不擅长的事情。像CouchDB视图这样的东西会非常适合。 - Jeremy Wall
谢谢,Jeremy。我会查看CouchDB。我又想到了一个调整这个想法的方法,就是在别处保存一个值,表示哪个“表”是活动的。假设当前值为“old_table”。这将告诉我的应用程序对“old_table”执行JOIN操作。然后,在创建更新的“new_table”之后,我会将“活动数据库”值更新为“new_table”。这将避免删除正在请求常规JOIN的表。 - bobbyh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接