这是《MongoDB 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 MongoDB 和关系型数据库不是简单替代关系。核心差异在数据模型、事务边界、Schema 演进、扩展方式和查询生态。选型应从访问模式和团队能力出发,而不是“哪个更新”。
28.1 数据模型
关系模型:
users
orders
order_items
products
文档模型:
{
_id: "o_10001",
user_id: "u_1001",
status: "PAID",
total_amount: NumberDecimal("599.00"),
items: [
{ sku_id: "sku_10001", quantity: 1 }
],
shipping_address: { city: "Shanghai" }
}
| 维度 | MongoDB | 关系型数据库 |
|---|---|---|
| 结构 | 文档和集合 | 表和行 |
| 关联 | 内嵌或 $lookup |
JOIN 和外键 |
| Schema | 灵活 + validator | 强 Schema |
| 类型 | BSON | SQL 标准类型 |
| 对象映射 | 贴近对象 | ORM 转换 |
28.2 事务能力
MongoDB:
- 单文档操作天然原子;
- 多文档事务支持 ACID;
- 事务应短小;
- 分片事务成本更高。
关系型数据库:
- 多表事务成熟;
- 隔离级别体系清晰;
- 复杂约束和外键能力强;
- 强事务场景通常更稳。
支付、账务、库存等复杂强一致模型,不应仅因为“文档方便”就忽略关系型数据库的成熟约束。
28.3 查询能力
| 能力 | MongoDB | 关系型数据库 |
|---|---|---|
| SQL | NoSQL API | SQL 生态成熟 |
| 聚合 | 聚合管道 | GROUP BY / 窗口函数 |
| JOIN | $lookup |
JOIN |
| 报表 | 中小规模 | 复杂报表生态广 |
| 全文 | 文本索引 | 数据库实现各异 |
| 地理 | 原生索引 | 因实现而异 |
| 分析 | 可用但需隔离 | 数仓生态更常用 |
MongoDB 管道表达能力强,但复杂分析通常应迁移到 ClickHouse、Snowflake 或其他分析系统。
28.4 Schema 演进
MongoDB 添加字段:
db.products.updateMany(
{},
{ $set: { schema_version: 2 } }
)
关系型数据库:
ALTER TABLE products ADD COLUMN schema_version INT;
差异:
| 维度 | MongoDB | 关系型 |
|---|---|---|
| 新增字段 | 应用先兼容,可选回填 | DDL 与默认值 |
| 删除字段 | 代码停止读写后清理 | ALTER TABLE |
| 类型约束 | validator + 应用 | 数据库强约束 |
| 回滚 | 新旧格式兼容 | DDL 回滚成本高 |
灵活 Schema 不代表不需要契约,只是把治理从表结构移到应用和 validator。
28.5 扩展方式
MongoDB:
- 副本集提供高可用和读扩展;
- 分片提供水平扩展;
- 分片键决定路由和分布;
- 原生分片运维体系成熟。
关系型数据库:
- 主从或高可用集群;
- 读写分离;
- 按业务拆库拆表;
- 分布式数据库或中间件;
- 云托管能力差异大。
如果数据天然按租户、用户、设备分片,MongoDB 的文档边界和分片模型比较自然。
28.6 性能模型
MongoDB 优势场景:
- 按主键取大 JSON 对象;
- 字段结构变化快;
- 聚合管道中小型实时统计;
- 多地域或租户分片;
- 前置事件或行为存储。
关系型优势场景:
- 复杂多表事务;
- 强外键和约束;
- 复杂 SQL 报表;
- 稳定关系模型;
- 精细 SQL 优化器生态。
性能结论必须基于自己的索引、数据量、并发和磁盘压测。
28.7 选型建议
优先考虑 MongoDB:
- 聚合读整个业务对象;
- 字段结构变化频繁;
- 多语言 JSON 契约;
- 租户或设备数据可自然分片;
- 需要原生 Change Stream;
- 团队有文档建模经验。
优先考虑关系型数据库:
- 强事务和多表约束;
- 财务账务系统;
- 复杂 SQL 和报表;
- 关系稳定且一致性要求高;
- 团队 SQL 运维成熟。
28.8 混合架构
常见组合:
orders MySQL / PostgreSQL
product doc MongoDB
search Elasticsearch
analytics ClickHouse
cache Redis
数据流:
business DB -> CDC / Change Stream -> document store / search / analytics
混合架构必须统一:
- 实体 ID;
- 数据契约;
- 对账任务;
- 数据归属;
- 生命周期。
本章小结
MongoDB 适合以文档为访问边界的灵活数据模型,关系型数据库适合强关系和强事务模型。两者可以通过 CDC 或 Change Stream 组合。选型的关键问题是:数据如何被读写、事务边界在哪里、未来如何扩展。
思考题
- 哪类业务适合内嵌文档模型?
- 为什么财务系统常选择关系型数据库?
- MongoDB 的灵活 Schema 需要哪些治理?
- 什么分片场景适合 MongoDB?
- 混合架构中如何保证数据一致性?