MySQL点赞功能应建user_like表,含user_id、target_type、target_id等字段,设UNIQUE KEY(user_id,target_type,target_id)防重复;用INSERT...ON DUPLICATE KEY UPDATE实现点赞,DELETE实现取消;查状态用SELECT 1,查总数用COUNT(*),需建(target_type,target_id)联合索引。
用 MySQL 实现点赞功能,核心是设计合理的数据表结构 + 配合业务逻辑做增删查操作,避免重复点赞、支持快速统计、兼顾性能和扩展性。
推荐单独建一张 user_like 表(或 post_like),不建议直接在内容表(如 article)里加 like_count 字段并频繁更新——容易引发并发冲突和写入瓶颈。
典型字段如下:
关键约束:UNIQUE KEY (user_id, target_type, target_id) —— 确保同一用户对同一目标只能点一次赞,数据库层杜绝重复。
用一条 INSERT ... ON DUPLICATE KEY UPDATE 或先查后判均可,但推荐前者更简洁、原子性强:
前端调用接口时,可统一走“切换”逻辑:先尝试插入,若主键冲突则
执行删除(或根据影响行数判断是新增还是删除)。
查某用户是否点过赞(如详情页显示“已点赞”按钮):
SELECT 1 FROM user_like WHERE user_id = 123 AND target_type = 'article' AND target_id = 456 LIMIT 1;查某内容的总点赞数(常用于列表页展示):
SELECT COUNT(*) AS like_count FROM user_like WHERE target_type = 'article' AND target_id = 456;注意:为提升性能,务必在 (target_type, target_id) 上建立联合索引;若常按用户查历史点赞,再加 (user_id) 索引。
如需支持“撤回点赞后仍计数”或“7天内有效点赞”,可在表中加 status(0=有效,1=已取消)或 expires_at 字段,查询时加上条件过滤。
若需热度排序(如按点赞数+时间衰减),不建议实时计算,可定时任务将热度值写入缓存或冗余字段,避免每次查询都 JOIN 或函数运算。