我正在为一个问答网站项目创建一个投票系统,在这个系统中,如果用户问了一个问题,他/她会失去-5分;回答一个问题+5,投票一个问题+1,等等(有点像这样和yahoo answers)
-->为了创建基本算术,我有一个"users_points“表,它将user_id和它们的总分联系起来。
+---+---------+
| 1 | 100 |
+---+---------+
| 2 | 54 |
+---+---------+-->基本上,如果用户做了某些任务,它将+或-积分。我如何防止用户说投票一个答案100次。例:我希望用户每个问题只能投票一次,等等。
发布于 2010-04-13 00:07:40
您应该创建一个votes表,其中包含以下列:user_id, question_id, delta。Delta值是投票的值,应该是1或-1 (这样,您就可以执行SUM(delta)来查找问题的点值)。
要获得唯一性,请在(user_id, question_id).上创建唯一索引
发布于 2010-04-13 00:26:03
看看这个设计对你有没有帮助

您可以在所有适当的位置进行反规范化(例如,删除VoteType并将布尔值放在适当的位置)
发布于 2010-04-13 00:28:44
我会保存一个详细的日志,记录哪些用户投票了哪些内容。因此,您可能有一个包含以下列的表:
user_id (用户ID)item_type (“问题”或“答案”-对项目类型使用枚举或外键类型table)item_id (实际项目的ID,例如问题ID或答案ID)up_down (枚举或布尔值,表示投票赞成还是反对))为了计算用户的"rep",您的应用程序逻辑将遍历投票,如果问题被投票通过,则添加+5,如果答案被投票否决,则添加-1,依此类推。
为了便于访问,您可能会将聚合值存储在users/questions/answers表中。但将日志保留在后台的最大好处是,您可以定期重新计算rep,并且不会丢失任何内容。你还可以说出哪些用户对哪些内容投了赞成票(例如,当你稍后返回问题时,SO会显示哪些答案是橙色的)。
或者只使用Stack Exchange,会更容易;)
https://stackoverflow.com/questions/2623469
复制相似问题