【问题标题】:Laravel - architecture problem with calculating votes for commentsLaravel - 计算评论投票的架构问题
【发布时间】:2021-11-09 04:10:30
【问题描述】:

我的网站存在一些架构问题。

我的网站有投稿,投稿有cmets。

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

我现在注册投票的方式是用户投票,然后在前端缓存该投票,以便用户刷新页面时显示投票。

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

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

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

但是,这个解决方案的问题是我也在计算没有收到任何选票的 cmets。

我在想我应该在comments 表中添加一个total_votes 列,并在前10 票或其他内容中使用它,在投票时运行队列作业。但是,如果评论的总投票数超过此值,则它会在计划任务中运行(与所有其他获得 10 多票的 cmets 一起)。

想法?有什么建议吗?

【问题讨论】:

    标签: php sql laravel


    【解决方案1】:

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

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

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

    那么当你展示你的 cmets 时

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2014-03-15
      • 2011-04-21
      • 2010-10-23
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多