我正在尝试将一个插件编程为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分钟)。
这些快捷方式可能会使负载变得可以接受,但我希望更优雅的解决方案能够更好地扩展。
你会如何构建这个? : - )
答案 0 :(得分:1)
在这方面需要考虑许多权衡因素。你已经在你的问题中暗示了他们。及时性和准确性与负荷和规模。
如果不需要及时性和准确性且系统经历高负荷的写入,则批量计算是减少负载和增加比例的最佳方法。
您必须仔细检查系统的使用情况,并确定需要优化的区域。优化写入与优化读取具有不同的约束。同样是数据的及时性或准确性。
确定哪些对您的应用程序最重要,并进行适当的权衡。
答案 1 :(得分:0)
old_table
,其中包含X行主题和sort_value字段。
我想在单个表上避免大量的UPDATE语句,因此我会定期用新计算的表替换旧表。据我所知,MySQL不支持“替换表”语法,所以每隔Y分钟,通过cron,我将创建一个名为new_sort_value
的表的更新版本。然后我将执行以下命令序列:
old_table
new_table
至old_table
这看起来像是一种有效的方法吗?