Architecture 关于如何处理评级的建议

Architecture 关于如何处理评级的建议,architecture,Architecture,我这里有一个我正在努力解决的架构问题 网站设计将有一个用户业力/评级/积分系统,与stackoverflow上的情况非常相似。评论、新帖子等会在某种程度上提高用户的评分。类似地,在某些内容上增加投票也会起到提振作用 我的问题是,您建议如何在体系结构中实现这一点 我最初的想法是,我会有兴趣确切地知道任何用户的点数来自何处,因此在每个用户下面增加一个字段并不能提供我需要的数据 因此,我脑海中提供对这些数据的完全访问的模型是,记录每个事件(post、comment、upvote),并从这些日志中获得用

我这里有一个我正在努力解决的架构问题

网站设计将有一个用户业力/评级/积分系统,与stackoverflow上的情况非常相似。评论、新帖子等会在某种程度上提高用户的评分。类似地,在某些内容上增加投票也会起到提振作用

我的问题是,您建议如何在体系结构中实现这一点

我最初的想法是,我会有兴趣确切地知道任何用户的点数来自何处,因此在每个用户下面增加一个字段并不能提供我需要的数据

因此,我脑海中提供对这些数据的完全访问的模型是,记录每个事件(post、comment、upvote),并从这些日志中获得用户评级。这里的问题是,我知道这个模型在长期内不能很好地扩展,因为计算用户的评级会变成SQL查询的噩梦


所以这里有某种中间立场。有人给了我一个建议,我应该朝这个方向走,或者读一些好的书。我甚至不知道要搜索什么。

如果你想拥有所有评级变化的历史记录,你需要以某种方式记录它。您可以创建一个文件来记录所有的日志并对其进行解析,这样您就可以保存一个很长的历史记录。如果您想使用SQL,请详细记录最后n次更改,并在更改之前对评级进行硬编码。

如果您想拥有所有评级更改的历史记录,您需要以某种方式记录它。您可以创建一个文件来记录所有的日志并对其进行解析,这样您就可以保存一个很长的历史记录。如果您想使用SQL,请详细保存最后n次更改,并在更改之前对评级进行硬编码。

如果您可以使用类似“”的内容,这将非常有帮助。这个想法是-在redis和mysql中都写,但在从redis中只读时。但是,您需要预先决定在redis中需要的所有密钥

例如:对于计算注释,您可以使用类似于
comments::count
的键,您可以在发布的每个注释上不断增加这些键。类似地,您可以使用诸如
Posts::count
等键。基本上,您(在某种程度上)在redis服务器中缓存所有count(*)类查询


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

如果您可以使用类似“”的方法,这将非常有帮助。这个想法是-在redis和mysql中都写,但在从redis中只读时。但是,您需要预先决定在redis中需要的所有密钥

例如:对于计算注释,您可以使用类似于
comments::count
的键,您可以在发布的每个注释上不断增加这些键。类似地,您可以使用诸如
Posts::count
等键。基本上,您(在某种程度上)在redis服务器中缓存所有count(*)类查询


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

谁说你只需要存储一次数据

我猜你脑海中的模型是“正确的”,所以我会坚持它;计算大量数据上的值-可以处理这些数据

根据你所说的,除了存储针对特定实体(如问题、答案等)的特定分数外,你还可以存储一个随着分数分配而递增的“运行总数”(分数)(我猜这将是数据库中“用户”表中的一个Int列)

更进一步说,您可以使用异步进程,定期检查递增值与点值对“分数”有贡献的实体之间的关系。此检查可能针对所有适当的数据运行,或仅针对特定时间段内的数据运行(即:自上次检查以来)

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

  • (在线事务处理)是指一类促进和管理面向事务的应用程序的系统
  • (在线分析处理)是一种快速回答多维分析查询的方法
听起来您头脑中的模型是围绕系统的预期“事务性”本质构建的,但是您还确定了一些更适合于更具分析性的方法的需求


没有理由不能两者兼得,最大的问题是如何做到。“running total”解决方案可以做到这一点,但仅适用于非常特定的情况。也许有必要看看更广泛的系统(以及你想把它放在哪里),也许现在“投资”一个更全面的分区系统。

谁说你只需要存储一次数据

我猜你脑海中的模型是“正确的”,所以我会坚持它;计算大量数据上的值-可以处理这些数据

根据你所说的,除了存储针对特定实体(如问题、答案等)的特定分数外,你还可以存储一个随着分数分配而递增的“运行总数”(分数)(我猜这将是数据库中“用户”表中的一个Int列)

更进一步说,您可以使用异步进程,定期检查递增值与点值对“分数”有贡献的实体之间的关系。此检查可能针对所有适当的数据运行,或仅针对特定时间段内的数据运行(即:自上次检查以来)

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

  • (在线事务处理)是指一类促进和管理面向事务的应用程序的系统
  • (在线分析处理)是一种快速实现ans的方法