我正在尝试在拉威尔实现一个reddit风格的投票系统,1)不允许来自同一帐户的重复投票,但b)允许人们更改他们的投票。
从本质上讲,有三个州需要投票:赞成票(+1),不赞成票(0)和反对票(-1)。
为了防止缩放问题,我使用了三个表: Users
, Comments
,和 votes
. Users
是一个包含所有用户数据以及 Reputation
表,其中包含他/她从他们的评论中获得的所有点的总和。 Comments
是包含内容的表,以及 score
列,该列保存注解获得的所有点的总和。最后, votes
有一个 user_id
以及 comment_id
一栏指明投票人,以及他们是投赞成票还是投反对票。
为了简化操作,取消通知只需删除相应的行。
为了实现这一点,每当有人插入一个新的 vote
行,它将执行触发器a)更新 reputation
以及b)更新 score
收到的评论。到目前为止,我想到了这个:
DELIMITER $$;
CREATE TRIGGER cast_vote BEFORE INSERT ON votes
FOR EACH ROW
BEGIN
-- Check if they are casting duplicate votes
IF EXISTS (SELECT 1 FROM votes WHERE comment_id = NEW.comment_id AND user_id = NEW.user_id AND vote != NEW.vote) THEN
BEGIN
-- Update the row to reflect whether they had upvoted/downvoted
-- Get rid of the row if it is an unvote
IF(NEW.vote = 0) THEN
BEGIN
DELETE FROM votes WHERE comment_id = NEW.comment_id AND user_id = NEW.user_id;
UPDATE comments WHERE
-- Stuck here: More nested if statements to check if the previous vote is positive or not.
基本上,我想更新 Comments
如果用户有 upvote
,会的 -1
从 score
但如果他们有 downvote
,会的 +1
,因为净变化 -1 -> 0
. 我觉得我可以做到这一点,但有一个更简单的方法,这样做,而不是嵌套多个如果逻辑里面。
我可以在我的laravel应用程序中这样做,但是对一个简单的upvote或downvote执行那么多查询似乎会占用性能。
暂无答案!
目前还没有任何答案,快来回答吧!