本文为「数据库全方位对比系列」第二篇,该系列的首部作品为「全方位对比 Postgres 和 MySQL (2023 版)」
为何对比 Postgres 和 MongoDB
根据 2023 年 Stack Overflow 调研,Postgres 已经成为最受欢迎和渴望的数据库了。
MongoDB 曾连续 4 年 (2017 - 2020) 蝉联此头衔。根据 DB-Engines 排名,Postgres 和 MongoDB 都是排名前 5 的数据库。它们两者都在爬楼梯,并且在夺取三大巨头:Oracle, MySQL 和 Microsoft SQL Server 的市场份额。
MongoDB 被广泛认为是一种与包括 Postgres 在内的 SQL 数据库相对立的 NoSQL 数据库。但近年来,它们正在趋同:
- MongoDB 变得更像传统关系型数据库,增加了多文档 ACID 事务,二级索引和高级查询功能。
- Postgres 不断改进其 JSON 能力,如索引、查询优化和更多操作符,这不禁让人们好奇 MongoDB 是否已经过气。
2018 年,The Guardian 写了一篇关于将 MongoDB 迁移到 Postgres 的长文。自此,虽然发生了很多变化,但有一件事没变:迁移数据库是极其痛苦的。
因为需要与各种数据库及其衍生产品集成,Bytebase 和各种数据库密切合作,而最大的数据库托管服务 Google Cloud SQL (https://cloud.google.com/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 专为处理非结构化和半结构化数据而设计。
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 之间的讨论:https://bit.ly/3pRLOzi。
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 进行分片是可以的:
- 分片和 ID 在 Instagram 的使用
- 驯服大象:Notion 在 Postgres 上进行分片的经验教训
易用性 Usability
MongoDB 不会事先强制 schema,并且容易上手。在 2010 年,10gen(开发 MongoDB 的公司的原名)发布了官方 MongoDB Node.js 驱动程序的第一个版本,开发人员能轻松地从 Node.js 应用程序与 MongoDB 数据库进行交互。该驱动程序提供了一个简单直观的 API,支持广泛的 MongoDB 功能,包括查询、索引和聚合等。正因为好用,如今,MongoDB 仍是全栈开发人员首选。
作为关系型数据库,Postgres 强制对 schema 进行了约束。而即使在关系型数据库中,Postgres 也比其他产品如 MySQL 更加严格。
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?
在某些领域中,明显一个数据库比另一个更合适:
- 如果你的应用程序具有复杂的业务逻辑并且需要复杂查询,请选 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。
💡 你可以访问官网,免费注册云账号,立即体验 Bytebase。