在MySQL数据库中存储投票数据的最有效方法(如StackOverflow)

时间:2011-12-23 02:37:27

标签: php mysql voting-system

我正在尝试复制SE的投票系统。我的网站上的用户应该只能对帖子进行一次投票,然后锁定。我目前有两个表,usersposts

我应该如何存储用户投票的帖子的信息?我想在posts中有一个列,用于存储已经投票的uid个用户。另一个想法是在users中有一个列,其中包含他/她投票的id个帖子。

我该怎么做?我想考虑可扩展性,并且很容易确定投票是否有效。

2 个答案:

答案 0 :(得分:4)

对于stackoverflow大小的事情,最佳做法是将单个投票存储在单独的表中。但是也要在直接附加到帖子的字段中保留派生计票数。随着数据库规模的扩大,在每次查看帖子时总结所有选票将变得非常昂贵。

通过在此用户/投票表上使用触发器,保持此派生字段相对容易。

答案 1 :(得分:4)

创建另一个表来存储来自usersposts表的信息:

CREATE TABLE votes (
      user_id INT
    , post_id INT
    , PRIMARY KEY (user_id, post_id)
);

采用这种方法:

  
    
      

我想在帖子中有一个专栏,可以存储投票的用户。另一个想法是在用户中有一个专栏,其中包含他/她投票的帖子的ID。

    
  

除非您将值存储为分隔值(以适合一个单元格)或JSON,否则您最终只能为一个帖子添加许多行。但那时,开始时这是一个糟糕的方法。

坚持创建一个新表,其中包含确定“投票”的关系。该表非常简单,可以检查:

SELECT COUNT(t1.post_id) AS vote_count
FROM votes AS t1
WHERE 
    t1.user_id = SOME_INTEGER
    AND t1.post_id = SOME_INTEGER