我正在创建一个应用程序,该应用程序将使用户能够创建帖子并喜欢帖子。我使用 MySQL 来存储所有数据。
我有表用户和帖子。我想防止用户多次喜欢同一篇文章的情况。我应该如何有效地存储每个帖子的点赞数?
我是否应该在 posts 表中有 like_count 列,并且还有另一个表“post_likes”,用于存储用户的 ID 和帖子的 ID。这样,在增加 posts 表上的计数之前,我必须检查 post_likes 表以查看用户是否已经喜欢。如何避免并发问题?
另一种选择是拥有 post_likes 表,并在用户每次喜欢帖子时插入一条新记录。我不会将喜欢计数存储在帖子表中,而是每次使用选择计数查询来计算它。但这有效吗?
检查用户是否已经喜欢的过程可以包含在一条 SQL 语句中并访问数据库吗?还是应该由我的应用程序的后端负责该检查?
提前谢谢您。
每当用户喜欢某个帖子时,您都需要有一个单独的记录。为此,我们创建 post_likes 表,如下所示:
create table post_likes(
id int primary key auto_increment,
post_id int not null,
user_id int not null,
foreign key (post_id) references posts(id) on delete cascade on update cascade,
foreign key (user_id) references users(id) on delete cascade on update cascade,
unique (post_id, user_id)
);
这个
unique
约束确保用户不会两次喜欢某个帖子,并且还提高了性能。您可以通过以下方式计算帖子的点赞人数:
select count(*)
from post_likes
where post_id = 1234;
您应该检查这对您来说是否足够快。在意识到性能问题实际发生之前,您不应该过早地对此进行优化。因为如果您开始将点赞者数量存储在不同的表中,那么您将必须始终同步数据并担心数据完整性。选择上面概述的方法,并且在出现实际性能问题之前不要执行上面的优化。
您可能还决定通过生成大量记录并同时发出许多读取和写入来进行压力测试,以查看何时开始变慢。
关于并发访问,一般来说MySQL处理得很好,所以我想你不会遇到并发访问的问题。不过,您仍然需要执行测试。