2017-07-17 70 views
-3

我有一个博客/论坛系统upvotes/downvote和每个评论也可以有upvote/downvote像reddit/stackoverflow系统。PHP/MYSQL用户博客/论坛投票系统

哪种方法可以确保已经投入使用的用户无法再次提供投票?

我确实考虑过创建一个带有单独upvote表的新行的可能性。但是如果一篇文章有​​30条评论,那么脚本最终会做30条数据库查询,这也会给我的服务器带来巨大的负担。另一种可能性是为用户的每个upvote做一行,一起查询它们并检查post_id,这又是不可行的。

那么哪个是upvote/downvote系统的最佳方式,以及像stumbleupon/reddit这样的网站做什么?就在他登录的那一刻,他可以看到一个红色的颜色,可能是他已经投了票的帖子

+0

我会做的是做一个单独的数据库表,每个职位有一个行,每行有一列存储已投票的用户数组。所以基本上如果用户1,2,5和8都投了票,你可以将它存储为[1,2,5,8](作为json存储,所以你可以'json_decode'它稍后使用它。1数据库调用 – GrumpyCrouton

+0

“该脚本最终会做30个数据库查询“为什么?如果用户提出了特定的评论,那么您只需要检查一个评论,看看他们是否投票过它。这是一个非常简单的SQL查询来做到这一点。在评论表中加入评论ID的投票表,并且包含用户ID以及它是否是向上/向下投票,然后你对评论ID /用户ID组合进行查询,他们不太可能尝试并投票全部30个,如果你认为这是一种可能性,那么你需要设计你的系统足够的规模,和/或使用足够强大的硬件。 – ADyson

+0

*“另一种可能性是为每个用户upvote做一排,查询它们并检查post_id又是不可行的。“* ...为什么这是不可行的?听起来像一个简单的连接用户ID,问题ID(作为复合PRIMARY KEY可能)和投票记录(+1或-1作为签名TINYINT(2)) – CD001

回答

0

我相信最好的方法是制作一个单独的表格,用于上/下选票,保存用户的ID,是投票,还是在评论/帖子/任何表中包含信誉。

如果用户试图做up/down投票,你只需要检查一个评论(为什么是30?)。然后,如果用户已经投票支持该评论/帖子,则只需在单独的表格中签入即可。如果是这样,你可以删除投票(例如像在SO - 如果你按两次投票,你的投票将被删除),或者如果人按下不同的按钮(f.e. downvote后upvote),你可以改变他的投票。之所以我提供给您的信誉列添加到您的信息/评论表,并在所有投票结果都是最新的信息后进行更新,是因为您不需要从该单独的表获得count(*)的声望,并且您的评论/帖子信誉将很容易并快速接收,特别是,如果您的数据库有很多行。

+0

谢谢,但是用户怎么看他是否已经在之前投入了它......在他登录进来的那一刻,他可以看到一个红色,可能是他已经投票的帖子,我在谈论那种类型的系统 – user2990955

+0

@ user2990955好吧,我相信然后当得到的评论,你可以使用**左加入**,并得到票'WHERE posts.post_id = YourPostID和reputation_giver = loggedUsersId',然后你要么登录用户上/如果用户还没有投票,那么可以减少投票或获得空。您可以看到[this](https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_join_left),其中返回null - 客户没有oders。 – Danielius