所以我通过研究自己发现,我可以设计一个喜欢帖子的结构的最好方法是拥有一个像下面这样的数据库。比方说像 Reddit,一个帖子可以被赞成、反对或根本不被投票。
数据库将包含三列,[username,post,liked]。
喜欢可以是某种 bool 值,1 表示喜欢,0 表示不喜欢。
然后为了找到一个类似 amount 的帖子,我会做 SELECT COUNT(*) FROM likes WHERE post=12341 AND liked=1
,然后对 liked=0 做同样的事情
(不喜欢),并在服务器端添加争议百分比。
所以我有一些顾虑,首先,确定用户是否喜欢某个帖子的合适方法是什么?我是否会尝试选择 liked
bool 值,然后检索或捕获错误。或者我会先检查记录是否存在,然后再做另一个选择来找出值?如果我想检查用户是否一次喜欢多个帖子怎么办?
其次,这张表不需要主键吗?因为没有一行具有相同的帖子和用户名,我应该使用复合主键吗?
请您参考如下方法:
为了性能,您需要更改数据库计划:
用户喜欢帖子表
字段:
Liked
应该是一个 bool 值,你是对的。您可以在代码中将其转换为 -1/+1。您将在别处缓存数字总计。用户名
应该是UserID
。为了提高速度,您只需要此表中的数值。 出于同样的原因,
Post
应该是PostID
。
您还需要一个数字主键,因为它们更易于搜索和执行子选择。
并且在(Username
,Post
)上创建唯一索引,因为这个表主要是为了速度而建立的索引。
那么用户是否对帖子进行了投票?
select id
from user_likes_post
where userID = 123 and postID = 456;
用户喜欢这个帖子吗?
select id
from user_likes_post
where userID = 123 and postID = 456 and liked = true;
你不需要担心错误,你要么得到结果,要么得不到,所以你不妨直接找到你想要的值:
select liked from user_liked_post where userID=123 and postID=456
获取他们喜欢的所有帖子:
select postID
from user_likes_post
where userID = 123 and liked = true;
后分数表
PostID
总赞数
总不喜欢
分数
第二个表将通过在第一个表上计算每 n 分钟转储和刷新一次。第二个表是您缓存的总分,您将为访问该帖子的所有用户实际加载。按照您认为合适的方式调整此重复转储和重新填充计划的频率。对于一个小的爱好或学生项目,每 30 秒或 2 分钟做一次;更大的站点,每 10 或 15 分钟一次。对于像 reddit 这样更大的网站,您可能希望使架构更复杂,以允许网站较繁忙的部分具有更快的刷新速度。
// this is not exact code, just an outline
totalLikes =
select count(*)
from user_likes_post
where postID=123 and liked=true
totalDislikes =
select count(*)
from user_likes_post
where postID=123 and liked=false
totalVotes = totalLikes + totalDislikes
score = totalLikes / totalVotes;
(您可以通过涉及用户的 localStorage
来模拟更新——客户端 Javascript 显示用户已投票的帖子的上升或下降。)