php - Laravel - 计算评论投票的架构问题
问题描述
我的网站有点架构问题。
我的网站有投稿,投稿有评论。
评论有赞成票和反对票。您也可以取消您的赞成票或反对票。和 reddit.com 完全一样
我现在注册投票的方式是用户投票,然后在前端缓存该投票,这样如果用户刷新页面,就会显示投票。
但后端发生的所有事情都是投票已在comments_votes
桌面上登记。
每隔 15 分钟,一个计划任务会获取过去 24 小时内创建的每条评论,然后对于每条评论,都会运行一个队列作业。comment_votes
然后,排队的作业通过查询所有具有该评论 ID的评论来计算评论的总分(总赞成票减去总反对票) 。
我这样做是因为我不想在每次有新投票时都计算评论的 total_score,因为这会产生大量不必要的查询。
然而,这个解决方案的问题是我也在计算没有收到任何投票的评论。
我在想我可能应该在表格中添加一total_votes
列comments
并拥有它,以便在前 10 票之类的情况下,在投票时运行队列作业。但是,如果一条评论的总投票数超过了这个数量,那么它就会在计划任务中运行(以及所有其他获得 10 多票的评论)。
想法?建议?
解决方案
这个答案是对您的数据库的结构做出一些重大假设,
但是你可以取消整个计划任务,后台进程,除非你有大量的流量,我不认为这会是一个问题,当数据被索引时数据库非常快。
如果您的 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 上有一个索引,以便快速加入
推荐阅读
- r - 左连接的 R 代码,使用匹配的日期和不匹配的其他日期
- c++ - C++ 构建顺序?
- javascript - 通过 npm / index.html 将 tex2max.js 导入 Angular 项目
- elasticsearch - 如何过滤 ElasticSearch 中的嵌套聚合?
- c# - 自定义 ActionFilterAttribute(authorization) 在未经授权的 actioncontext 响应后不会停止路由执行
- c# - 我不知道如何填充列表
在 ac# 中正确执行任务 - r - 根据条件组合过滤数据框行
- java - 登录后的 selenium webdriver url
- google-apps-script - 将电子表格的副本保存到共享文件夹时出现权限问题
- java - 我可以在不使用 Regex 库的情况下为仅在 Java 中具有特定语法的某些文件设置权限吗?