业务场景

起点

那是 2023 年的一个周末。

我刚完成了一个内容平台的 MVP 版本,核心功能很简单:

  • 用户可以发布文章
  • 其他用户可以阅读文章
  • 每篇文章有标题、内容、发布时间

“看起来不错,” 我的朋友看完后说,“但总觉得少了点什么。”

“少了什么?” 我问。

“点赞啊!” 他说,“没有点赞,作者怎么知道大家喜欢他的文章?用户怎么表达认可?”

那一刻,我意识到:点赞功能不是锦上添花,而是必需品。

需求分析

我坐下来,仔细思考点赞功能到底需要什么:

核心功能

用户视角:
1. 看到文章时,能看到这篇文章有多少人点赞
2. 如果我点过赞,按钮是高亮状态
3. 点击点赞按钮,数字 +1,按钮变高亮
4. 再次点击,取消点赞,数字 -1,按钮变灰

作者视角:
1. 看到自己的文章有多少点赞
2. 点赞数能激励我继续创作

平台视角:
1. 统计热门文章(按点赞数排序)
2. 推荐高赞文章给用户

数据需求

文章维度:
- 点赞总数:这篇文章被点赞的次数
- 点赞用户列表:谁点过赞(用于判断当前用户是否点赞)

用户维度:
- 我点赞的文章列表(可选,后续功能)

看起来很简单,对吧?

我当时也是这么想的。

第一版设计

我打开数据库设计工具,创建了一张表:

数据设计要点

  • 核心是在 article_likes 里保存业务事实,而不是把规则散落在应用逻辑里。
  • 索引服务于高频查询,重点是缩小扫描范围,而不是堆更多字段。
  • 关键字段包括 idarticle_iduser_idcreated_at,它们决定后续查询和管理能力。

这个设计满足了我的需求:

  • 每条记录代表一个用户对一篇文章的点赞
  • UNIQUE KEY 保证了用户不能重复点赞
  • 想知道文章的点赞数?SELECT COUNT(*) FROM article_likes WHERE article_id = ?
  • 想知道用户是否点赞?SELECT * FROM article_likes WHERE article_id = ? AND user_id = ?

完美!

我在后台写了个接口:

然后我又写了个获取点赞数的接口:

上线,测试,完美运行!

初步成果

两周后,我看了看数据:

文章数:156 篇
用户数:482 人
点赞总数:2,341 次
日均点赞:约 150 次

一切正常,用户很喜欢这个功能。

我还发现了一些有趣的数据:

点赞最多的文章:
1. "如何学习系统设计" - 127 赞
2. "我的创业故事" - 98 赞
3. "技术选型指南" - 76 赚

看到这些数字,我感到很满足。用户在互动,作者在创作,平台在成长。

潜在问题

虽然功能正常运行,但我开始思考一些问题:

问题 1:性能

每次获取文章详情,都要执行两个额外查询:

  • 查询点赞数:SELECT COUNT(*)
  • 查询是否点赞:SELECT *

如果文章列表页显示 20 篇文章,就是 40 个额外查询

问题 2:扩展性

现在每天只有 150 次点赞,如果平台增长到:

  • 100 倍:15,000 次/天
  • 1000 倍:150,000 次/天

数据库扛得住吗?

问题 3:一致性

如果用户快速点击点赞/取消点赞:

  • 网络延迟可能导致状态不一致
  • 数据库事务可能冲突

这些问题暂时没有暴露,但我知道它们迟早会来。