IT序号网

mysql之喜欢的帖子设计细节

kevingrace 2024年08月15日 编程语言 10 0

所以我通过研究自己发现,我可以设计一个喜欢帖子的结构的最好方法是拥有一个像下面这样的数据库。比方说像 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 显示用户已投票的帖子的上升或下降。)


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!