讲师中心 微信公众号
AI工具推荐 视频效率加速

怎么用mysql实现点赞收藏功能_mysql社交项目设计

落婷大大_3488

落婷大大_3488

发布时间:2026-02-16 10:26:02

|

709人浏览过

|

来源于php中文网

原创

点赞和收藏需用独立的 user_likes 和 user_favorites 表建模多对多关系,字段含 user_id、target_type、target_id,联合唯一索引防重复;内容表冗余 like_count/favorite_count 并原子更新;取消操作需 WHERE 全条件删除并检查影响行数。

怎么用mysql实现点赞收藏功能_mysql社交项目设计

点赞和收藏功能在 MySQL 中不是靠单表搞定的,核心在于「用户行为」与「内容实体」之间的多对多关系建模,且必须区分 like 和 favorite 两种独立行为。

用什么表结构存点赞和收藏

不能把 is_liked、is_favored 直接加到文章/视频/帖子表里——这会导致更新锁竞争、无法查“谁点过赞”、不支持取消再点、也不利于统计和分页拉取用户行为列表。

  • 建一张 user_likes 表:user_id(主键之一)、target_type(如 'post'、'comment')、target_id(被点赞的记录 ID)、created_at;联合唯一索引为 (user_id, target_type, target_id)
  • 同理建 user_favorites 表,字段结构一致;复用同一套逻辑但物理分离,方便后期各自加字段(比如收藏可加 folder_id,点赞不需要)
  • target_type 字段用字符串而非外键,避免跨表约束和迁移成本;查询时用 WHERE target_type = 'post' AND target_id = 123 即可

怎么防止重复点赞或重复收藏

靠数据库层唯一约束最可靠,应用层判断只是优化体验,不能替代它。

kashen-mysql DDLtoExcel
kashen-mysql DDLtoExcel

解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。

下载
  • 插入前不做 SELECT 判断(存在竞态:A 查无记录 → B 插入 → A 再插入,重复)
  • 直接执行 INSERT INTO user_likes (user_id, target_type, target_id) VALUES (101, 'post', 2001),配合 ON DUPLICATE KEY UPDATE created_at = NOW()(如果已存在就刷新时间,适合“重新点赞”语义)
  • 或者用 INSERT IGNORE 忽略重复错误(适合纯开关型操作);MySQL 返回影响行数:1 表示新增,0 表示已存在
  • 注意:唯一索引必须包含 user_id + target_type + target_id 全部三列,漏掉任一列都会失效

怎么高效查某条内容被赞了多少次

不要每次查都 COUNT(*) FROM user_likes WHERE target_type='post' AND target_id=123 —— 高频读场景下会拖慢主库,尤其当行为表上亿行时。

  • 在内容表(如 posts)里加冗余字段:like_count 和 favorite_count,类型用 INT UNSIGNED
  • 点赞/取消点赞时,用原子操作更新:UPDATE posts SET like_count = like_count + 1 WHERE id = 123(+1 或 -1)
  • 该字段只用于展示总数;真实行为明细仍以 user_likes 表为准(比如做防刷、审计、通知等)
  • 如果业务要求强一致性(如秒杀式点赞排行榜),可用 Redis 的 INCR/DECR 做前置计数,再异步落库,但多数社交场景用数据库原子更新足够

取消点赞或取消收藏怎么写才安全

删除操作比插入更容易出错,关键是「删对了人、删对了目标、且知道删没删成」。

  • 用 DELETE FROM user_likes WHERE user_id = 101 AND target_type = 'post' AND target_id = 123,不要只用 target_id
  • 检查 ROW_COUNT() 返回值:0 表示本来就没点过,1 表示成功取消;这是判断“当前状态”的唯一依据
  • 不要先 SELECT 再 DELETE —— 同样有竞态;也不要依赖返回的“影响行数是否为 0”来报错,而应视作正常流程分支
  • 如果要同时更新计数,建议用事务包裹:
    START TRANSACTION;
    DELETE FROM user_likes WHERE user_id = 101 AND target_type = 'post' AND target_id = 123;
    UPDATE posts SET like_count = like_count - 1 WHERE id = 123;
    COMMIT;
    ,并确保 posts.id 有主键索引,否则 UPDATE 可能锁表

最容易被忽略的是 target_type 的枚举管理——它散落在 SQL、代码、文档里,没人维护就会出现 'Post'、'post'、'POST' 混用,导致查询永远为空;建议在应用层定义常量,在建表注释里写明合法值,并在 INSERT 前做简单校验。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4723

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

971

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1229

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6721

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3443

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6700

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9261

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1250

2024.04.29

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn