【问题标题】:How To Sort Like Hacker News如何像黑客新闻一样排序
【发布时间】:2009-06-04 00:01:50
【问题描述】:

我正在尝试为 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 分钟更新一次)。

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

您将如何构建它? :-)

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

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

    如果不需要及时性和精确性并且系统遇到高写入负载,则批处理计算是减少负载和增加规模的最佳方法。

    您确实必须检查系统的使用情况并确定需要优化的领域。优化写入与优化读取有不同的约束。数据的及时性或准确性也是如此。

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

    【讨论】:

      【解决方案2】:

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

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

      • 删除old_table
      • new_table 重命名为 old_table

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

      【讨论】:

      • 如果有点笨拙,我认为这是有效的。不幸的是,您正在处理要添加的系统的约束。扩展这类问题正是 rdbms 数据库不擅长的事情。像 CouchDB View 这样的东西就在这条小巷里。
      • 谢谢,杰里米。我会看看 CouchDB。我只是想到了对这个想法的另一个调整,即只是保存(在其他地方)一个值,该值表明 table 处于活动状态。假设当前值为old_table。这将告诉我的应用程序对old_table 进行 JOIN。然后,在创建更新的new_table 之后,我会将“活动数据库”值更新为new_table。这将避免 DROP 正在为常规 JOIN 请求的表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多