关于如何处理评级的建议

时间:2010-11-10 05:37:56

标签: architecture

我在这里有一个架构问题,我正在努力。

网站设计会有一个用户业力/评级/积分系统非常类似于在stackoverflow上完成的工作。诸如评论,新帖子等内容会使用户的评级得到某种提升。同样地,对某些内容进行投票之类的事情也会提振。

我的问题是你如何建议在架构中实现这一点。

我最初的想法是,在某些方面我会确切地知道任何用户的点来自哪里,所以简单地在每个用户下面增加一个字段将不会提供我需要的数据。

因此,我的头脑中提供对此数据的完全访问权限的模型将记录每个事件(post,comment,upvote)以及从这些日志派生的用户评级。这里的问题是我知道这个模型从长远来看不能很好地扩展,因为计算用户的评级会变成SQL查询的噩梦。

所以这里有某种中间立场。任何人都有一个建议,我应该采取什么方向,或者一些好的阅读。我甚至不确定要搜索什么。

3 个答案:

答案 0 :(得分:1)

谁说您只需存储一次数据?

我猜你头脑中的模型是'正确的',所以我坚持下去;计算大量数据的值 - 可以处理。

根据您所说的内容,除了针对特定实体存储特定点(如问题,答案等)之外,您还可以存储一个“运行总计”(分数),该分数在分配点时递增(我猜这将是数据库中“User”表中的Int列。

更进一步,您可以拥有异步进程,该进程会定期检查增量值,这些实体的点值对“得分”有贡献。此检查可能针对所有适当的数据运行,或者仅针对某个时间段内的数据(即:自上次检查以来)。

另一种方法是沿着相同的路线但是在工业规模上;你听说过OLTP和OLAP吗?

  • OLTP(在线交易处理)是指一类促进和管理面向交易的应用程序的系统。
  • OLAP(在线分析处理)是一种快速回答多维分析查询的方法。

听起来你头脑中的模型是围绕系统的预期“交易”性质建立的,但你也发现了一些更适合更加分析方法的要求。

没有理由你不能两者兼顾,最大的问题是如何做到。 “运行总计”解决方案可以做到这一点,但仅适用于非常具体的情况。可能值得关注更广泛的系统(以及您想要采用的系统),也许现在可以“投资”更全面的分区系统。

答案 1 :(得分:0)

如果您想拥有所有评级更改的历史记录,您需要以某种方式记录它。您可以创建一个文件来记录它们并解析它,这样您就可以保留冗长的历史记录。如果你想通过SQL保留最后n个更改的详细信息并在更改之前硬编码评级。

答案 2 :(得分:0)

如果您可以使用“Redis”之类的内容,那么它会有很大帮助。这个想法是 - 用redis和mysql编写,但是当读取只读取redis时。但是,您需要在redis中预先确定所需的所有密钥。

例如:对于计算评论,您可以使用Comments:<userId>:count等密钥,您可以在发布的每条评论中继续增加。类似地,你可以拥有像Posts:<userId>:count等的密钥。基本上,你(在某种程度上)缓存redis服务器中的所有count(*)类查询。

如果在某个时候您需要更改业力/评级方法,那么您可以根据需要使用mysql数据重新生成redis密钥。