本文为「数据库全方位对比系列」第二篇,该系列的首部作品为「全方位对比 Postgres 和 MySQL (2023 版)」
根据 2023 年 Stack Overflow 调研,Postgres 已经成为最受欢迎和渴望的数据库了。
MongoDB 曾连续 4 年 (2017 - 2020) 蝉联此头衔。根据 DB-Engines 排名,Postgres 和 MongoDB 都是排名前 5 的数据库。它们两者都在爬楼梯,并且在夺取三大巨头:Oracle, MySQL 和 Microsoft SQL Server 的市场份额。
MongoDB 被广泛认为是一种与包括 Postgres 在内的 SQL 数据库相对立的 NoSQL 数据库。但近年来,它们正在趋同:
2018 年,The Guardian 写了一篇关于将 MongoDB 迁移到 Postgres 的长文。自此,虽然发生了很多变化,但有一件事没变:迁移数据库是极其痛苦的。
因为需要与各种数据库及其衍生产品集成,Bytebase 和各种数据库密切合作,而最大的数据库托管服务 Google Cloud SQL (https://cloud.google.com/sql) 也是 Bytebase 创始人的杰作之一。
根据实操经验,我们对 Postgres 和 MongoDB 在以下几个维度进行了比较:
除非另有说明,下文基于最新的主要版本 Postgres 15 和 MongoDB 6。在文章中,我们使用 Postgres 而不是 PostgreSQL,虽然 PostgreSQL 才是官方名称,但被认为是 Postgres 史上最错误的决定。
大多数公司使用数据库来支持其内部基础设施,Postgres 和 MongoDB 都允许此类使用。
Postgres 也支持 JSON 列,因此可以像使用 MongoDB 一样使用 Postgres,将表定义为:
CREATE TABLE my_collection (
id SERIAL PRIMARY KEY,
data JSONB
);
MongoDB 和 Postgres 都非常擅长处理 JSON。MongoDB 使用自己发明的 BSON 格式存储 JSON,而 Postgres 使用 JSONB 格式。如果有兴趣,可以看下这个关于选择在 Postgres 中使用 BSON 还是 JSONB 之间的讨论:https://bit.ly/3pRLOzi。
MongoDB 有两个优点:
性能主要由访问模式决定。如果一个操作涉及不同的实体,MongoDB 通常更快,因为数据是 denormalized 的,并且不需要在表之间进行复杂的连接操作。另一方面,Postgres 能处理复杂查询,这得益于 SQL 和其先进的查询优化器。
MongoDB 在早期因为不支持 ACID 事务而被认为是不太靠谱的。不过自从他们收购了 WiredTiger 并使用其 WiredTiger 存储引擎后,就不一样了。从事务角度来看,如今的 MongoDB 和 Postgres 一样稳定可靠。
MongoDB 通过其副本集提供内置的自动 failover 功能。而 Postgres 则需要像类似 pg_auto_failover 的第三方解决方案。
MongoDB 可以进行横向扩展 (scale out),而 Postgres 通常则是纵向扩展 (scale up)。
MongoDB 是一个支持自动分片的分布式数据库。对于 Postgres 来说,我们通常会先将单节点的 postgres 进行纵向扩展,并尽可能地推迟使用分片解决方案。当然,对 Postgres 进行分片是可以的:
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 强大。
运行多节点的 MongoDB 比运行多节点的 Postgres 更容易,因为分片和 failover 可以由 MongoDB 来处理。不过,如果你在单个节点上分别运行这两个数据库,那么 MongoDB 的分布式特性可能会成为负担。
各种第三方供应商提供了 Postgres 托管服务。MongoDB 的 License 阻止了第三方提供 MongoDB 托管服务,不过他们自己的 MongoDB Atlas 比对应的 Postgres 托管服务更加完善。毕竟,第三方很难击败第一方云服务。
Postgres 有可扩展的架构,并且仍由社区维护。近年来,Postgres 生态系统蓬勃发展,它拥有众多插件,使其能够处理比其他数据库更多样化的任务。而且由于其自由许可证和坚实的架构,在每个应用程序平台提供托管数据库服务时,它们都选择了 Postgres,从早期的 Heroku 到新兴的 Supabase, render 和 Fly.io。
MongoDB 作为市值最高的商业开源企业采取了更商业化的做法。一旦在生态系统中出现了优秀解决方案,MongoDB 公司都会考虑收购以确保其成为整体 MongoDB 产品线不可或缺的一部分。其中一些著名的收购包括:
尽管 Postgres 和 MongoDB 采取了截然不同的方式来培育生态系统,但都取得了巨大成功。
在某些领域中,明显一个数据库比另一个更合适:
然而,大多数应用程序用例介于两者之间,而且两个数据库都非常强大:
总体而言,Postgres 是一个更通用的数据库,它采用关系模型、提供全面 SQL 功能、具备可扩展架构,并由一个热情洋溢的社区推动。
MongoDB 是一个全面的数据库解决方案,它普及了文档模型、内置了伸缩性和高可用性,提供了完整的开发者体验,并由一个敏锐的营利性商业实体推动着。
如果在 Postgres 和 MySQL 之间做选择很困难,那么在 Postgres 和 MongoDB 之间选择也不容易。而且随着两个数据库都朝着更强的方向发展,选择只会变得越来越困难。
最后,在一个组织内部 Postgres 和 MongoDB 共存也是很常见的情况。如果需要同时管理 Postgres 和 MongoDB 的开发生命周期,可以来了解一下 Bytebase。
你可以访问官网,免费注册云账号,立即体验 Bytebase。