我正在尝试复制 SE 的投票系统。我网站上的用户应该只能对帖子进行一次投票,然后他们就被锁定了。我目前有两个表,users
并且posts
.
我应该如何存储用户投票的帖子的信息?我正在考虑有一个列posts
来存储对其uid
进行投票的用户的 s。另一个想法是在他/她投票的帖子中users
有一列。id
我该怎么做?我想考虑可扩展性并且容易确定投票是否有效。
我正在尝试复制 SE 的投票系统。我网站上的用户应该只能对帖子进行一次投票,然后他们就被锁定了。我目前有两个表,users
并且posts
.
我应该如何存储用户投票的帖子的信息?我正在考虑有一个列posts
来存储对其uid
进行投票的用户的 s。另一个想法是在他/她投票的帖子中users
有一列。id
我该怎么做?我想考虑可扩展性并且容易确定投票是否有效。
对于 stackoverflow 的大小,最佳实践是将各个投票存储在单独的表中。但也要在直接附加到帖子的字段中保留派生的投票计数。随着数据库规模的增长,每次查看帖子时汇总所有投票的成本将变得异常昂贵。
通过在这个用户/投票表上使用触发器来保持这个派生字段相对容易。
创建另一个表来存储users
和posts
表中的信息:
CREATE TABLE votes (
user_id INT
, post_id INT
, PRIMARY KEY (user_id, post_id)
);
使用这种方法:
我正在考虑在帖子中设置一个专栏来存储对其投票的用户的 uid。另一个想法是在用户中有一列,其中包含他/她投票过的帖子的 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