「 简记往来」第七篇:数据库选型——为什么用MongoDB而不是MySQL?

一、一个被反复问到的问题

"你用的是MySQL还是MongoDB?"这是我在技术社区分享简记往来时被问到最多的问题之一。

答案:MongoDB

原因不是"MongoDB比MySQL好",而是"在这个场景下,MongoDB更合适"。

二、MongoDB vs MySQL 的核心差异

维度 MySQL MongoDB
数据模型 关系型(表+行) 文档型(Collection+Document)
Schema 固定,需要迁移 灵活,可动态变化
查询语言 SQL JSON-like
事务 强事务支持 多文档事务支持有限
扩展性 垂直扩展为主 水平扩展(分片)
适合数据量 GB级 TB级

三、为什么选MongoDB?

3.1 Schema灵活

简记往来的数据结构在开发过程中变化了好几次。

最初只有 records 表,后来加了 contacts 表,再后来给记录加了 note 字段、created_by 字段。

如果用MySQL,每次加字段都要执行 ALTER TABLE 迁移,数据量大的时候可能锁表几分钟甚至几小时。

用MongoDB,直接加字段就行,不需要任何迁移。

3.2 文档型存储更自然

礼账的数据是"联系人+往来记录",用文档型存储非常自然:

json 复制代码
{
  "contact": {
    "name": "张三",
    "tags": ["同事"]
  },
  "records": [
    { "type": "receive", "amount": 800, "date": "2026-06-20" },
    { "type": "send", "amount": 500, "date": "2026-06-20" }
  ]
}

3.3 开发速度快

Mongoose ODM 让 MongoDB 的操作非常方便:

javascript 复制代码
const record = await Record.create({
  bookId: currentBookId,
  contactId: contact._id,
  type: 'receive',
  amount: 800
});

不需要写复杂的SQL JOIN,不需要担心外键约束。

3.4 水平扩展能力

如果用户从6.8万增长到68万、680万,MongoDB的分片集群可以无缝扩展。

MySQL的分库分表方案要复杂得多,需要在应用层做路由。

四、MongoDB的不足之处

4.1 事务支持较弱

MongoDB支持多文档事务,但性能不如关系型数据库。

简记往来的解决方案:尽量把相关数据放在一个文档里,减少跨文档操作。

4.2 数据分析能力有限

MongoDB的聚合框架不如SQL灵活,复杂的报表查询可能比较吃力。

简记往来的解决方案:统计查询直接做聚合,62万条数据下响应时间稳定在150ms以内。

4.3 对开发者要求更高

MongoDB的Schema灵活性是把双刃剑。好的一面是开发快,坏的一面是需要开发者自己保证数据一致性。

简记往来的解决方案:在应用层做好数据校验,用Mongoose的Schema定义数据结构。

五、什么场景适合MongoDB?

场景 是否适合 理由
Schema经常变化 ✅ 非常适合 无需迁移
文档型数据 ✅ 非常适合 存储自然
快速迭代 ✅ 非常适合 开发速度快
需要强事务 ❌ 不太适合 事务支持弱于关系型
复杂报表 ⚠️ 部分适合 聚合框架够用但不如SQL

六、简记往来的真实数据

用MongoDB支撑简记往来半年:

  • 6.8万用户
  • 62万条记录
  • 日均请求约2万次
  • 核心查询响应时间:150ms
  • 服务器配置:2核4G

这个配置撑得住

七、总结

技术选型的核心原则:不选"最好的",选"最合适的"

MongoDB适合简记往来,因为它Schema灵活、开发快、易扩展。如果哪天用户量暴增到百万级,MongoDB的分片集群也能撑住。

但如果你在做的是一个需要强事务、复杂报表的系统,MySQL可能更合适。

八、第一阶段总结

7篇文章,从需求发现到技术选型,我们把简记往来的"起点"讲清楚了:

  1. 需求从哪里来:从自己的真实痛点出发
  2. 为什么通用App不够用:单向流水管不了双向关系
  3. 技术选型逻辑:微信小程序 + Node.js + MongoDB
  4. 环境搭建:开发者工具 + 工程化配置
  5. 项目结构:分层架构 + 目录规范
  6. 登录鉴权:wx.login + JWT
  7. 数据库选型:MongoDB vs MySQL

第一阶段的目标是"让读者知道我们为什么这么做",而不是"直接给代码"

第二阶段(7篇)将进入核心功能实现:数据模型设计、批量记礼、多账本、多人协作。如果你想继续,可以告诉我。

评论区聊聊:你的项目用的什么数据库?选它的理由是什么?