全方位对比 Postgres 和 MongoDB (2023 版)

本文为「数据库全方位对比系列」第二篇,该系列的首部作品为「全方位对比 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 (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 专为处理非结构化和半结构化数据而设计。

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 之间的讨论: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 更加严格。

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【高级数据结构】树状数组

目录 树状数组1 (单点修改,区间查询) 树状数组1 (单点修改,区间查询) 洛谷:树状数组1https://www.luogu.com.cn/problem/P3374 题目描述 如题,已知一个数列,你需要进行…

MySQL案例——多表查询以及嵌套查询

系列文章目录 MySQL笔记——表的修改查询相关的命令操作 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库,对MySQL数据库的简单操作,MySQL的外接应用程序使用说明 文章目录 系列文章目录 前言 一 创建数据库 1.1 创建一个部门表 1.…

C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

1. TCP 套接字编程流程 1.1 概念 流式套接字编程针对TCP协议通信,即是面向对象的通信,分为服务端和客户端两部分。 1.2 服务端编程流程: 1)加载套接字库(使用函数WSAStartup()),创建套接字&…

【Python机器学习】实验04(2) 机器学习应用实践--手动调参

文章目录 机器学习应用实践1.1 准备数据此处进行的调整为:要所有数据进行拆分 1.2 定义假设函数Sigmoid 函数 1.3 定义代价函数1.4 定义梯度下降算法gradient descent(梯度下降) 此处进行的调整为:采用train_x, train_y进行训练 1.5 绘制决策边界1.6 计算…

Spring AOP 中,切点有多少种定义方式?

在 Spring AOP 中,我们最常用的切点定义方式主要是两种: 使用 execution 进行无侵入拦截。使用注解进行拦截。 这应该是是小伙伴们日常工作中使用最多的两种切点定义方式了。但是除了这两种还有没有其他的呢?今天松哥就来和大家聊一聊这个话…

Linux-Shell

1.什么是Bash shell(壳) Bash Shell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕。 通过xshell连接,就是打开了一…

uniAPP 视频图片预览组件

效果图 思路&#xff1a;处理文件列表&#xff0c;根据文件类型归类 已兼容 H5 ios 设备&#xff0c;测试已通过 浙政钉&#xff0c;微信小程序 视频资源因为&#xff0c;没有预览图&#xff0c;用灰色图层加播放按钮代替 <template><!--视频图片预览组件 -->&l…

《面试1v1》Kafka与传统消息系统区别

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

React AntDesign写一个导出数据的提示语 上面有跳转的路径,或者点击知道了,关闭该弹层

效果如下&#xff1a; 代码如下&#xff1a; ForwardDataCenterModal(_blank);export const ForwardDataCenterModal (target?: string) > {let contentBefore React.createElement(span, null, 数据正在处理中&#xff0c;请稍后前往);let contentAfter React.creat…

lightGBM实例——特征筛选和评分卡模型构建

数据还是采用这个例子里的数据&#xff0c;具体背景也同上。 添模型构建——使用逻辑回归构建模型&#xff0c;lightGBM进行特征筛选 lightGBM模型介绍请看这个链接&#xff1a;集成学习——Boosting算法&#xff1a;Adaboost、GBDT、XGBOOST和lightGBM的简要原理和区别 具体代…

Docker复习

目录 1. Docker的理解1.1 Docker三要素 2 安装Docker2.1 安装命令2.2 配置阿里云加速器 3 Docker命令3.1 启动类命令3.2 镜像类命令 4 实战4.1 启动容器&#xff0c;自动创建实例4.2 查看Docker内启动的容器4.3 退出容器4.4 其他4.5 导入导出文件4.6 commit 5 Dockerfile5.1 理…

uniapp:H5定位当前省市区街道信息

高德地图api&#xff0c;H5定位省市区街道信息。 由于uniapp的uni.getLocation在H5不能获取到省市区街道信息&#xff0c;所以这里使用高德的逆地理编码接口地址接口&#xff0c;通过传key和当前经纬度&#xff0c;获取到省市区街道数据。 这里需要注意的是&#xff1a;**高德…

0基础学习VR全景平台篇 第69篇:VR直播-如何设置广告

直播间可以插入轮播广告&#xff0c;并且支持外链跳转&#xff0c;能够有效地提升VR直播活动的转化率。 1、点击&#xff0c;添加广告 2、广告图展现形式分为两种&#xff1a;普通广告和全屏广告&#xff0c;普通广告在非全屏播放的直播间显示&#xff0c;全屏广告在全屏播放的…

Raki的读paper小记:LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

Abstract&Introduction&Related Work 研究任务 对大模型进行部分微调 已有方法和相关工作 现有技术通常通过扩展模型深度引入推理延迟&#xff08;Houlsby 等人&#xff0c;2019&#xff1b;Rebuffi 等人&#xff0c;2017&#xff09;&#xff0c;或通过减少模型可用序…

redis的四种模式优缺点

redis简介 Redis是一个完全开源的内存数据结构存储工具&#xff0c;它支持多种数据结构&#xff0c;以及多种功能。Redis还提供了持久化功能&#xff0c;可以将数据存储到磁盘上&#xff0c;以便在重启后恢复数据。由于其高性能、可靠性和灵活性&#xff0c;Redis被广泛应用于…

什么是 MyBatis?

经过前几篇博客的学习 Spring 系列的基本操作已经实现的差不多了&#xff0c;接下来&#xff0c;我们来学习更重要的知识&#xff0c;将前端传递的数据存储起来&#xff0c;或者查询数据库里面的数据。 一、MyBatis 是什么&#xff1f; MyBatis 是一款优秀的持久层框架&…

东南大学轴承故障诊断(Python代码,CNN模型,适合复合故障诊断研究)

运行代码要求&#xff1a; 代码运行环境要求&#xff1a;Keras版本>2.4.0&#xff0c;python版本>3.6.0 本次实验主要是在两种不同工况数据下&#xff0c;进行带有复合故障的诊断实验&#xff0c;没有复合故障的诊断实验。 实验结果证明&#xff0c;针对具有复合故障的…

面试—Redis相关

文章目录 一、概述二、缓存1、缓存穿透2、缓存击穿3、缓存雪崩4、双写一致性5、持久化6、数据过期策略7、数据淘汰策略 三、分布式锁四、其它面试题1、主从复制2、哨兵3、分片集群结构4、I/O多路复用 一、概述 使用场景&#xff1a; Redis的数据持久化策略有哪些什么是缓存穿透…

智能安全配电装置应用场景有哪些?

安科瑞 华楠 一、应用背景 电力作为一种清洁能源&#xff0c;给人们带来了舒适、便捷的电气化生活。与此同时&#xff0c;由于使用不当&#xff0c;维护不及时等原因引发的漏电触电和电气火灾事故&#xff0c;也给人们的生命和财产带来了巨大的威胁和损失。 为了防止低压配电…

SkyEye与Jenkins的DevOps持续集成解决方案

在技术飞速发展的当下&#xff0c;随着各行各业的软件逻辑复杂程度提升带来的需求变更&#xff0c;传统测试已无法满足与之相对应的一系列测试任务&#xff0c;有必要引入一个自动化、可持续集成构建的DevOps平台来解决此类问题。本文将主要介绍SkyEye与Jenkins的持续集成解决方…