首页 > 解决方案 > Laravel - 计算评论投票的架构问题

问题描述

我的网站有点架构问题。

我的网站有投稿,投稿有评论。

评论有赞成票和反对票。您也可以取消您的赞成票或反对票。和 reddit.com 完全一样

我现在注册投票的方式是用户投票,然后在前端缓存该投票,这样如果用户刷新页面,就会显示投票。

但后端发生的所有事情都是投票已在comments_votes桌面上登记。

每隔 15 分钟,一个计划任务会获取过去 24 小时内创建的每条评论,然后对于每条评论,都会运行一个队列作业。comment_votes然后,排队的作业通过查询所有具有该评论 ID的评论来计算评论的总分(总赞成票减去总反对票) 。

我这样做是因为我不想在每次有新投票时都计算评论的 total_score,因为这会产生大量不必要的查询。

然而,这个解决方案的问题是我也在计算没有收到任何投票的评论。

我在想我可能应该在表格中添加一total_votescomments并拥有它,以便在前 10 票之类的情况下,在投票时运行队列作业。但是,如果一条评论的总投票数超过了这个数量,那么它就会在计划任务中运行(以及所有其他获得 10 多票的评论)。

想法?建议?

标签: phpsqllaravel

解决方案


这个答案是对您的数据库的结构做出一些重大假设,

但是你可以取消整个计划任务,后台进程,除非你有大量的流量,我不认为这会是一个问题,当数据被索引时数据库非常快。

如果您的 comments_votes 表有一个名为 vote 的列,并且该投票可以是 -1 表示反对票,+1 表示赞成票,那么您只需对所有投票进行 SUM

然后当你显示你的评论

select comments.comment, sum(comments_votes.vote) as total_votes
  from comments 
       left outer join comments_votes on comments_votes.comment_id = comments.id

确保您在 comments_votes.comment_id 上有一个索引,以便快速加入


推荐阅读