PHP和MySQL中的评级系统

时间:2009-07-27 10:01:35

标签: php mysql architecture

如果我们查看stackoverflow网站,我们就有投票权。但问题是存储谁投票谁没有投票的最佳途径是什么。让我们进一步简化这一点,并说我们只能投票,我们只能删除Up投票。

我在考虑让表格成为这样的形式

  

question - Id(INT) | userId(INT) | title(TEXT) | vote(INT) | ratedBy(TEXT)

休息是自我解释但是被评为用户的逗号分隔ID值。

我正在考虑阅读 ratedBy ,并将其与当前登录用户的 userId 进行比较。如果他在 ratingBy 中存在,他可以投票,否则他可以取消他的投票。这反过来将从 ratedBy

中删除该值

3 个答案:

答案 0 :(得分:5)

我认为让另一张桌子“投票”更好。用户和投票之间的关系是n到n,因此应该创建一个新表。它应该是这样的:

question id (int) | user id (int) | permanent (bool) | timestamp (datetime)

永久字段可用于在给定时间后保留选票,如同那样 可以根据期望的特征添加其他字段。 由于每行至少需要16B,因此在表使用4GB之前,表中最多可以有250M行(如果每个表有一个存档,则为fat32限制,MyISAM和InnoDB就是这种情况)。 另外,正如Matthew Scharley在评论中指出的那样,不要一次性将所有投票加载到内存中(因为获取结果集中的所有表)。您始终可以使用LIMIT子句来缩小查询结果范围。

答案 1 :(得分:2)

新表:

文章ID |用户ID |评分

如果文章ID和用户ID构成复合键,则评级为1,表示upvote,-1表示downvote,0表示删除投票(或只删除行)。

答案 2 :(得分:0)

我相信你的设计无法为大量选民扩展。 典型的做法是创建表

表1:问题 - Id(INT)| userId(INT)|标题(TEXT)
表2:问题 - ID(INT)|投票(INT)| ratedBy(TEXT)

然后你可以用这样的查询计算投票数:

SELECT t1.question_Id, t1.userId, t1.title, t2.sum(vote)
FROM table1 t1
LEFT JOIN table2 t2 ON t1.question_id = t2.question_id