我正在创建一个应用程序,将使用户能够创建帖子,也喜欢帖子.我正在使用MySQL存储所有数据.

我有表,用户和帖子.我想防止用户喜欢同一帖子不止一次的情况.

我应该如何有效地存储每个帖子的点赞数量?

我是否应该在POSTS表中有LIKE_COUNT列,并在另一个表"POST_LIKES"中存储用户ID和帖子ID?

这样,在递增POSTS表上的计数之前,我必须判断POST_LIKES表,看看用户是否已经喜欢上了.

如何避免并发问题?

另一种 Select 是让POST_LIKES表在用户每次喜欢一篇帖子时插入一条新记录.我不会将赞计数存储在POSTS表中,而是每次都使用SELECT COUNT查询来计算它.

但这是有效的吗?

判断用户是否已经喜欢的过程可以包含在一条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;

你应该判断一下这对你来说是否够快.在您意识到实际出现性能问题之前,不应该过早地对此进行优化.因为如果您开始在不同的表中存储相似者的计数,那么您将不得不始终同步数据并担心数据完整性. Select 上面概述的方法,在出现实际的性能问题之前不要执行上面的优化.

您还可以决定进行压力测试,方法是生成大量记录并同时发出许多读写命令,以查看何时开始变慢.

至于并发访问,一般来说,MySQL处理得很好,所以我认为您在并发访问方面不会有问题.不过,您仍然需要执行测试.

Mysql相关问答推荐

数组上的MySQL、JSON_CONTAINS用法

表列中的SQL SUM MENY值记录单个查询

MySQL工作台的编码问题

查询具有JSON对象数组的列时,JSON_CONTAINS的MySQL语法错误

Group By 查询运行速度太慢而无法正常运行

Mysql如何分行分词

如何使用mysql更新列中的json数据

基于关系的每个实体有一个真值和多个假值

如何从具有第一行列值的表中 Select 客户的最新记录

在 where 子句中左连接多个值

在 MySQL 中 Select COUNT of MAX

如何在 MySQL 中搜索多个列?

重新加载 .env 变量而不重新启动服务器(Laravel 5,共享主机)

将 Django DB 从 SQLite 迁移到 MySQL 的最佳方法是什么?

按日期和时间降序排序?

在连接条件上使用 IS NULL 或 IS NOT NULL - 理论问题

ASP.NET EntityFramework 获取数据库名称

从mysql中的大表中快速 Select 随机行

在 WHERE 子句中使用 mysql concat()?

判断多个列的一个值