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


The most efficient method storing voting data in a MySQL database (like StackOverflow)

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

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

我该怎么做?我想要考虑到可扩展性和确定投票是否有效的便利性。

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

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

使用这种方法:

我正在考虑在帖子中有一个列,它将存储已投票的用户的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

对于stackoverflow的大小,最佳实践是将单个投票存储在单独的表中。但也要在直接附在帖子上的字段中保存派生的投票计数。随着数据库规模的增长,汇总每次浏览帖子的所有投票将变得非常昂贵。

通过在这个user/votes表上使用触发器来保持这个派生字段相对容易。