使用触发器实现投票逻辑

yftpprvb  于 2021-08-09  发布在  Java
关注(0)|答案(0)|浏览(213)

我正在尝试在拉威尔实现一个reddit风格的投票系统,1)不允许来自同一帐户的重复投票,但b)允许人们更改他们的投票。
从本质上讲,有三个州需要投票:赞成票(+1),不赞成票(0)和反对票(-1)。
为了防止缩放问题,我使用了三个表: Users , Comments ,和 votes . Users 是一个包含所有用户数据以及 Reputation 表,其中包含他/她从他们的评论中获得的所有点的总和。 Comments 是包含内容的表,以及 score 列,该列保存注解获得的所有点的总和。最后, votes 有一个 user_id 以及 comment_id 一栏指明投票人,以及他们是投赞成票还是投反对票。
为了简化操作,取消通知只需删除相应的行。
为了实现这一点,每当有人插入一个新的 vote 行,它将执行触发器a)更新 reputation 以及b)更新 score 收到的评论。到目前为止,我想到了这个:

  1. DELIMITER $$;
  2. CREATE TRIGGER cast_vote BEFORE INSERT ON votes
  3. FOR EACH ROW
  4. BEGIN
  5. -- Check if they are casting duplicate votes
  6. IF EXISTS (SELECT 1 FROM votes WHERE comment_id = NEW.comment_id AND user_id = NEW.user_id AND vote != NEW.vote) THEN
  7. BEGIN
  8. -- Update the row to reflect whether they had upvoted/downvoted
  9. -- Get rid of the row if it is an unvote
  10. IF(NEW.vote = 0) THEN
  11. BEGIN
  12. DELETE FROM votes WHERE comment_id = NEW.comment_id AND user_id = NEW.user_id;
  13. UPDATE comments WHERE
  14. -- Stuck here: More nested if statements to check if the previous vote is positive or not.

基本上,我想更新 Comments 如果用户有 upvote ,会的 -1score 但如果他们有 downvote ,会的 +1 ,因为净变化 -1 -> 0 . 我觉得我可以做到这一点,但有一个更简单的方法,这样做,而不是嵌套多个如果逻辑里面。
我可以在我的laravel应用程序中这样做,但是对一个简单的upvote或downvote执行那么多查询似乎会占用性能。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题