mysql - 喜欢的帖子设计细节

标签 mysql sql performance database-design

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

关于mysql - 喜欢的帖子设计细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59505855/

相关文章:

mysql - 在更新期间模拟 MySQL 中的 LAG

c# - 使用数据表中的文本填充文本框 - 组合框

unpack 结合 Perl 中的 join 的性能

mysql - 谁能告诉我为什么这个查询需要很长时间才能运行?

sql - oracle查询中如何获取字符串的前两个字符?

python numpy 掩码意味着性能

performance - 快速搜索 Tmemo 行的方法

PHP for 循环 - 在表中显示数据

php - 无法在kali linux上配置LAMP

mysql - 连接两个表后如何显示5个最大值?