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

news2024/12/23 10:02:00

本文为「数据库全方位对比系列」第二篇,该系列的首部作品为「全方位对比 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.coloradmin.cn/o/789770.html

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

相关文章

Qt Core学习日记——第九天QObjectData

本文结合示例代码更易理解&#xff0c;moc_XTest.cpp文件是写好XTest.h、XTest.cpp后由qt编译生成 版本 Qt5.15.2 示例代码 XTest.h #pragma once #include <qobject.h> #include <QFlags> class XTest : public QObject { Q_OBJECT Q_CLASSINFO("au…

【JavaEE初阶】HTTP请求的构造及HTTPS

文章目录 1.HTTP请求的构造1.1 from表单请求构造1.2 ajax构造HTTP请求1.3 Postman的使用 2. HTTPS2.1 什么是HTTPS?2.2 HTTPS中的加密机制(SSL/TLS)2.2.1 HTTP的安全问题2.2.2 对称加密2.2.3 非对称加密2.2.3 中间人问题2.2.5 证书 1.HTTP请求的构造 常见的构造HTTP 请求的方…

数组(超详解)

数组 1.一维数组1.1 一维数组的创建1.2 数组的初始化1.3 一维数组的使用1.4 一维数组在内存中的储存 2. 二维数组2.1 二维数组的创建2.2 二维数组的初始化2.3 二维数组的使用2.4 二维数组在内存中的储存 3.数组越界4.数组作为函数参数4.1 冒泡排序函数错误设计4.2 数组名是什么…

Gnomon水下环境 中

海下的石头 方法一 nParticleShape1.zhong_lie rand(0,6); nParticleShape1.xuan_zhuanrand(<<0,0,0>>,<<5,360,5>>); 缩放原始物体 写错地方了&#xff0c;播放石头一样 海下的石头 方法二 有点问题&#xff0c;使用旧粒子系统 让第一针有粒子 播…

基于SpringBoot+Vue的摄影跟拍预定管理系统设计与实现(源码+lw+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Idea 开启 lombook 注解插件处理器

Idea 开启 lombook 注解插件处理器 方便编译器识别 勾选 Enable annotation processing

【每日一题】—— C. K-th Not Divisible by n (Codeforces Round 640 (Div. 4))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

【雕爷学编程】Arduino动手做(86)---4*4位 WS2812 全彩模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

导轨表和智能电表有哪些区别?

导轨表和智能电表是两种不同的电表类型&#xff0c;它们在功能、性能和应用领域等方面存在一些区别。下面将从多个方面对这两种电表进行比较和分析。 一、定义和功能 导轨表是一种多功能电力仪表&#xff0c;通常用于测量电流、电压、功率、能量等电参数。它采用模块化设计&am…

小黑子—JavaWeb:第三章 HTTP、Tomcat与Servlet

JavaWeb入门3.0 1. Web核心项目2. HTTP2.2 HTTP请求数据格式2.3 HTTP响应数据格式 3. Tomcat3.1 tomact的基本使用3.2 tomact配置3.3 tomact部署项目3.4 web项目结构3.5 创建MavenWeb项目3.6 IDEA集成本地Tomcat3.7 Tomcat的Maven插件 4. Servlet4.1 Servlet执行流程4.2 Servle…

使用jmeter+ant+jenkins+git搭建自动化测试平台

最近正在学习自动化测试&#xff0c;于是随手搭建了一下jmeterantjenkinsgit平台。 接下来&#xff0c;我会按照jdk&#xff0c;jmeter&#xff0c;ant&#xff0c;jenkins,git这个顺序一步一步的搭建起来。 一、jdk。这个就不多说了。我用的是1.8版本的&#xff0c;配环境变…

c++语言风格字符串和QT风格字符串区别

c语言风格字符串和QT风格字符串区别 API实例 第一个是QT风格字符串 第二个是C风格字符串 c语言风格 string a "hello";std::cout<<a<<endl;;char* aa "hello";qDebug()<<aa;qDebug()<<*aa;QT风格 QString str2("hello2&qu…

VarifocalNet An IoU-aware Dense Object Detector 论文学习

1. 解决了什么问题&#xff1f; 密集目标检测器会预测出大量的候选检测框&#xff0c;如何准确地对它们进行排序是取得优异性能的关键。以前的方法通常会在 NMS 时根据类别得分对预测框做排序&#xff0c;但这可能损害模型表现&#xff0c;因为类别得分并不能体现边框定位的准…

畅网n6005 nas主机更新微码

原因 由于畅网n6005小主机上安装了 pve , 在pve中安装了iStore OS &#xff0c;然后用docker安装了alist 用作nas&#xff0c; 平时在外经常要访问。但是这个机器偶尔死机&#xff0c;导致无法脸上网盘&#xff0c;且家里会断网&#xff0c; 因为我家用这个路由器做软路由。做…

k8s核心概念

一、集群架构与组件 1&#xff0c;相关组件 【1】 master node三个组件 k8s的控制节点&#xff0c;对集群进行调度管理&#xff0c;接受集群外用户去集群操作请求master node 组成&#xff08;四个组件&#xff09;&#xff1a;控制面 API Server&#xff1a;通信kube-Sche…

WormGPT – 网络犯罪分子用来犯罪的人工智能工具

WormGPT – 网络犯罪分子用来发起商业电子邮件泄露攻击的生成式人工智能工具 前言 什么是蠕虫GPT&#xff08;WormGPT&#xff09; WormGPT是基于EleutherAI于2021年创建的大型语言模型GPT-J的AI模型。它具有无限的字符支持、聊天记忆保留和代码格式化功能。 如果未部署适当…

文件或文件夹名称中有空格如何批量去除

平时在工作中会经常碰到文件或文件夹里面有特殊符号&#xff0c;那么要如何批量去除文件名中的特殊符号&#xff1f;其实去符号也不是困难的事&#xff0c;可以使用《文件批量改名高手》对文件名进行批量去除特殊符号&#xff0c;操作步骤如下。 先打开《文件批量改名高手》&a…

React Native实现震动反馈效果

React Native实现理想的震动效果 一、背景说明 业务开发中&#xff0c;总会用到一些和用户反馈的效果&#xff0c;用来提升用户对于某个事件或者操作的重要程度&#xff0c;比如常见的就是 长按复制、滑动或点击图表、点击底部TabBar时的反馈等操作。 二、构思实现及过程 2.…

【Yolov8自动标注数据集教程】

Yolov8自动标注数据集教程 1 前言2 先手动标注数据集&#xff0c;训练出初步的检测模型2.1 手动标注数据集2.2 Yolov8环境配置2.2.1 Yolov8下载2.2.2 Yolov8环境配置 2.3 Yolov8模型训练&#xff0c;得到初步的检测模型2.3.1 训练方式 3 使用初步的检测模型实现自动数据集标注3…

vue3中 状态管理pinia得使用

在做项目中 vue2改造vue3项目时的vuex 发生得一些变化 vue3项目中 先看下 stores.jsimport { defineStore } from pinia 引入方法注册方法 import { getListFieldLevel } from ..api/index.jsexport const useScreenStore defineStore(screen, {state: () > ({fieldList:…