本文为「数据库全方位对比系列」第二篇,该系列的首部作品为「全方位对比 Postgres 和 MySQL (2023 版)」
为何对比 Postgres 和 MongoDB
根据 2023 年 Stack Overflow 调研,Postgres 已经成为最受欢迎和渴望的数据库了。
![file]()
MongoDB 曾连续 4 年 (2017 - 2020) 蝉联此头衔。根据 DB-Engines 排名,Postgres 和 MongoDB 都是排名前 5 的数据库。它们两者都在爬楼梯,并且在夺取三大巨头:Oracle, MySQL 和 Microsoft SQL Server 的市场份额。
![file]()
MongoDB 被广泛认为是一种与包括 Postgres 在内的 SQL 数据库相对立的 NoSQL 数据库。但近年来,它们正在趋同:
- MongoDB 变得更像传统关系型数据库,增加了多文档 ACID 事务,二级索引和高级查询功能。
- Postgres 不断改进其 JSON 能力,如索引、查询优化和更多操作符,这不禁让人们好奇 MongoDB 是否已经过气。
![file]()
2018 年,The Guardian 写了一篇关于将 MongoDB 迁移到 Postgres 的长文。自此,虽然发生了很多变化,但有一件事没变:迁移数据库是极其痛苦的。
![file]()
因为需要与各种数据库及其衍生产品集成,Bytebase 和各种数据库密切合作,而最大的数据库托管服务 Google Cloud SQL 也是 Bytebase 创始人的杰作之一。
根据实操经验,我们对 Postgres 和 MongoDB 在以下几个维度进行了比较:
- 许可证 License
- 数据模型 Data Model
- JSON 支持 JSON Support
- 性能 Performance
- 可靠性 Reliability
- 伸缩性 Scalability
- 易用性 Usability
- 可运维性 Operability
- 生态系统 Ecosystem
除非另有说明,下文基于最新的主要版本 Postgres 15 和 MongoDB 6。在文章中,我们使用 Postgres 而不是 PostgreSQL,虽然 PostgreSQL 才是官方名称,但被认为是 Postgres 史上最错误的决定。
许可证 License
- Postgres 发布在 PostgreSQL 许可下,是一种类似于 BSD 或 MIT 的自由开源许可。
- MongoDB 社区版采用由 MongoDB 公司自行创建的 Server Side Public License (SSPL) 发布,以防止他人提供竞争性的 MongoDB 服务,MongoDB 公司还根据要求提供商业许可证。
大多数公司使用数据库来支持其内部基础设施,Postgres 和 MongoDB 都允许此类使用。
数据模型 Data Model
- Postgres 是关系型数据库,它将数据存储在预先定义好的列中,并通过使用外键来建立表之间的关系。
- MongoDB 是面向文档的数据库,这意味着数据以文档形式存储在集合中。每个文档都是一个类似 JSON 的结构,可以包含嵌套字段和数组。MongoDB 专为处理非结构化和半结构化数据而设计。
![file]()
Postgres 也支持 JSON 列,因此可以像使用 MongoDB 一样使用 Postgres,将表定义为:
CREATE TABLE my_collection (
id SERIAL PRIMARY KEY,
data JSONB
);
JSON 支持 JSON Support
MongoDB 和 Postgres 都非常擅长处理 JSON。MongoDB 使用自己发明的 BSON 格式存储 JSON,而 Postgres 使用 JSONB 格式。如果有兴趣,可以看下这个关于选择在 Postgres 中使用 BSON 还是 JSONB 之间的讨论。
MongoDB 有两个优点:
- 内置 schema 验证器。
- 与 Node.js / 前端生态系统的集成。MongoDB 是全栈开发人员常用的选择,他们通常会使用 Node 进行开发。
性能 Performance
性能主要由访问模式决定。如果一个操作涉及不同的实体,MongoDB 通常更快,因为数据是 denormalized 的,并且不需要在表之间进行复杂的连接操作。另一方面,Postgres 能处理复杂查询,这得益于 SQL 和其先进的查询优化器。
可靠性 Reliability
MongoDB 在早期因为不支持 ACID 事务而被认为是不太靠谱的。不过自从他们收购了 WiredTiger 并使用其 WiredTiger 存储引擎后,就不一样了。从事务角度来看,如今的 MongoDB 和 Postgres 一样稳定可靠。
MongoDB 通过其副本集提供内置的自动 failover 功能。而 Postgres 则需要像类似 pg_auto_failover 的第三方解决方案。
伸缩性 Scalability
MongoDB 可以进行横向扩展 (scale out),而 Postgres 通常则是纵向扩展 (scale up)。
MongoDB 是一个支持自动分片的分布式数据库。对于 Postgres 来说,我们通常会先将单节点的 postgres 进行纵向扩展,并尽可能地推迟使用分片解决方案。当然,对 Postgres 进行分片是可以的:
易用性 Usability
MongoDB 不会事先强制 schema,并且容易上手。在 2010 年,10gen(开发 MongoDB 的公司的原名)发布了官方 MongoDB Node.js 驱动程序的第一个版本,开发人员能轻松地从 Node.js 应用程序与 MongoDB 数据库进行交互。该驱动程序提供了一个简单直观的 API,支持广泛的 MongoDB 功能,包括查询、索引和聚合等。正因为好用,如今,MongoDB 仍是全栈开发人员首选。
作为关系型数据库,Postgres 强制对 schema 进行了约束。而即使在关系型数据库中,Postgres 也比其他产品如 MySQL 更加严格。
![file]()
Stack Overflow 的调查显示,尽管 Postgres 是受访者中最受欢迎的数据库,但 MongoDB 在新手中更受欢迎。
而在处理复杂查询方面,MQL (MongoDB Query Language) 则不如 SQL 强大。
可运维性 Operability
运行多节点的 MongoDB 比运行多节点的 Postgres 更容易,因为分片和 failover 可以由 MongoDB 来处理。不过,如果你在单个节点上分别运行这两个数据库,那么 MongoDB 的分布式特性可能会成为负担。
各种第三方供应商提供了 Postgres 托管服务。MongoDB 的 License 阻止了第三方提供 MongoDB 托管服务,不过他们自己的 MongoDB Atlas 比对应的 Postgres 托管服务更加完善。毕竟,第三方很难击败第一方云服务。
生态系统 Ecosystem
Postgres 有可扩展的架构,并且仍由社区维护。近年来,Postgres 生态系统蓬勃发展,它拥有众多插件,使其能够处理比其他数据库更多样化的任务。而且由于其自由许可证和坚实的架构,在每个应用程序平台提供托管数据库服务时,它们都选择了 Postgres,从早期的 Heroku 到新兴的 Supabase, render 和 Fly.io。
MongoDB 作为市值最高的商业开源企业采取了更商业化的做法。一旦在生态系统中出现了优秀解决方案,MongoDB 公司都会考虑收购以确保其成为整体 MongoDB 产品线不可或缺的一部分。其中一些著名的收购包括:
- WiredTiger 存储引擎
- mLab 托管服务
- Realm 移动端数据同步方案
- Compass MongoDB GUI 客户端
尽管 Postgres 和 MongoDB 采取了截然不同的方式来培育生态系统,但都取得了巨大成功。
Postgres or MongoDB?
![file]()
在某些领域中,明显一个数据库比另一个更合适:
- 如果你的应用程序具有复杂的业务逻辑并且需要复杂查询,请选 Postgres。
- 如果你的应用程序具有简单的数据模型并需要处理海量数据,请选 MongoDB。
然而,大多数应用程序用例介于两者之间,而且两个数据库都非常强大:
- 作为文档型数据库,MongoDB 提供了一流的 JSON 支持。而 Postgres 在开源关系型数据库中也有着最好的 JSON 支持。
- 对于全栈开发人员来说,MongoDB 曾经是首选,因为它与 Node.js 完美集成。而随着主要第三方应用平台都提供托管 Postgres 服务,Postgres 则变得愈发有吸引力。
- 对于后端开发人员来说,在添加事务支持后,MongoDB 变得更加诱人了。谁不想避免繁琐的 schema 更改并享受更快速的迭代呢?
- MongoDB Atlas 构建了最精细化的托管数据库服务之一;而各种大小第三方供应商则都提供了出色的 Postgres 托管解决方案。
总体而言,Postgres 是一个更通用的数据库,它采用关系模型、提供全面 SQL 功能、具备可扩展架构,并由一个热情洋溢的社区推动。
MongoDB 是一个全面的数据库解决方案,它普及了文档模型、内置了伸缩性和高可用性,提供了完整的开发者体验,并由一个敏锐的营利性商业实体推动着。
如果在 Postgres 和 MySQL 之间做选择很困难,那么在 Postgres 和 MongoDB 之间选择也不容易。而且随着两个数据库都朝着更强的方向发展,选择只会变得越来越困难。
最后,在一个组织内部 Postgres 和 MongoDB 共存也是很常见的情况。如果需要同时管理 Postgres 和 MongoDB 的开发生命周期,可以来了解一下 Bytebase。
![file]()
💡 你可以访问官网,免费注册云账号,立即体验 Bytebase。