如何使用mysql实现点赞功能及设计点赞数据表

来源:建站技术作者:落伍者头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何使用mysql实现点赞功能及设计点赞数据表》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用mysql实现点赞功能及设计点赞数据表》有用,将其分享出去将是对创作者最好的鼓励。

点赞功能是内容类、社交类应用中非常常见的交互功能,使用mysql实现点赞功能时,核心是先设计合理的点赞数据表,再基于表结构实现对应的业务逻辑。合理的表设计能避免数据冗余,提升查询效率,减少后续维护成本。

如何使用mysql实现点赞功能及设计点赞数据表

点赞数据表设计

点赞数据表需要记录用户的点赞行为,核心要关联用户和目标内容,同时避免重复点赞。推荐设计如下表结构:

CREATE TABLE `user_like` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint(20) NOT NULL COMMENT '点赞用户ID',
  `target_id` bigint(20) NOT NULL COMMENT '被点赞目标ID,比如文章ID、评论ID',
  `target_type` tinyint(4) NOT NULL COMMENT '目标类型,1文章 2评论 3动态,用于区分不同点赞对象',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '点赞状态,1点赞 0取消点赞',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_target` (`user_id`,`target_id`,`target_type`),
  KEY `idx_target` (`target_id`,`target_type`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户点赞记录表';

表设计的核心要点:

  • 使用user_idtarget_idtarget_type三个字段建立唯一索引,避免同一用户对同一目标重复点赞,同时支持取消点赞后再次点赞的场景。
  • 增加status字段而不是直接删除记录,方便后续统计用户的点赞历史,也避免频繁删除数据导致表碎片。
  • 建立target_idtarget_typestatus的联合索引,提升查询某目标点赞总数的效率。

点赞核心业务逻辑实现

用户点赞操作

用户点击点赞时,需要先判断是否已经点赞过,再执行对应操作。可以使用以下SQL实现:

INSERT INTO user_like (user_id, target_id, target_type, status) 
VALUES (1001, 2001, 1, 1) 
ON DUPLICATE KEY UPDATE status = IF(status = 1, 1, 1), update_time = CURRENT_TIMESTAMP;

这段SQL的逻辑是:如果用户没有点赞过该目标,就插入一条点赞记录;如果已经存在记录,就更新状态为1(点赞),同时更新修改时间。因为唯一索引的存在,不会插入重复记录。

用户取消点赞操作

用户取消点赞时,不需要删除记录,只需要更新status字段为0即可:

UPDATE user_like 
SET status = 0, update_time = CURRENT_TIMESTAMP 
WHERE user_id = 1001 AND target_id = 2001 AND target_type = 1;

查询用户是否点赞某目标

判断用户是否对某个目标点过赞,只需要查询对应记录的status即可:

SELECT status FROM user_like 
WHERE user_id = 1001 AND target_id = 2001 AND target_type = 1 
LIMIT 1;

如果查询到结果且status为1,说明用户当前处于点赞状态;如果status为0或者没有查询到记录,说明用户没有点赞。

统计某目标的点赞总数

统计某篇文章、某条评论的点赞总数,只需要查询对应目标下status为1的记录数:

SELECT COUNT(*) AS like_count FROM user_like 
WHERE target_id = 2001 AND target_type = 1 AND status = 1;

业务层代码示例

以Java为例,实现点赞功能的业务层逻辑如下:

public class LikeService {
    // 点赞操作
    public boolean doLike(Long userId, Long targetId, Integer targetType) {
        // 执行点赞SQL,返回影响行数
        int rows = likeMapper.insertOrUpdateLike(userId, targetId, targetType);
        return rows > 0;
    }

    // 取消点赞操作
    public boolean cancelLike(Long userId, Long targetId, Integer targetType) {
        int rows = likeMapper.updateLikeStatus(userId, targetId, targetType, 0);
        return rows > 0;
    }

    // 查询用户点赞状态
    public boolean isLiked(Long userId, Long targetId, Integer targetType) {
        Integer status = likeMapper.selectLikeStatus(userId, targetId, targetType);
        return status != null && status == 1;
    }

    // 查询目标点赞数
    public Integer getLikeCount(Long targetId, Integer targetType) {
        return likeMapper.selectLikeCount(targetId, targetType);
    }
}

注意事项

  • 如果点赞量非常大,单表数据增长过快,可以考虑按target_type或者时间进行分表,提升查询效率。
  • 高并发场景下,点赞操作可以加分布式锁,避免同一用户短时间内重复提交点赞请求导致数据异常。
  • 如果不需要保留用户的点赞历史,也可以直接删除点赞记录,但建议保留status字段的设计,方便后续扩展统计功能。

mysql点赞功能数据表设计SQL语句修改时间:2026-06-09 15:27:32

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。