MongoDB vs PostgreSQL15个关键差异

466 阅读26分钟

当开始一个新的项目时,开发人员可能挣扎的事情之一是选择一个堆栈。锁定正确的技术来解决问题可能是一个令人伤脑筋的经历。尤其是在数据库方面,要解决这个问题很有挑战性,尤其是当你不清楚你的数据将如何被使用时。

由于数据库是软件开发的基本基础,它们为各种类型和规模的项目建设服务,因此,了解数据库的重要性,为你的堆栈选择一个合适的数据库结构是有帮助的。

本文将通过探讨两个伟大的数据库管理系统之间的差异,帮助你挑选合适的开源数据库。MongoDB和PostgreSQL。

什么是MongoDB?

The MongoDB logo, showing the text beside an upright, green leaf.

MongoDB的标志。(图片来源:Mecdata)

MongoDB是一个跨平台、开源的非关系型数据库,于2009年2月11日发布。它以使用类似JSON的文件和可选模式而闻名。

MongoDB被认为是市场上最先进的云数据库服务之一,具有无与伦比的数据移动性和跨Azure、AWS和Google云的分布,内置自动化的工作负载和资源优化。

它还允许你使用Atlas CLI、UI或基础设施即服务(IaaS)资源提供商在几分钟内创建一个云数据库。

有了MongoDB Atlas,当新功能进入你的管道时,你可以保持你的应用程序运行,以跟上你激增的流量。MongoDB Atlas为其用户提供了先进的数据库优化工具,使你始终拥有你所需要的数据库资源来继续建设。

主要功能

以下是MongoDB的几个主要特点,它在市场上最好的非关系型数据库中赢得了一席之地:

  • 性能建议:随着你的应用程序的发展,MongoDB以最佳的按需模式设计实践来协助你实现最高效率。
  • 多云集群:通过MongoDB,你可以实现弹性和强大的应用程序,同时利用两个或多个云。
  • 负载平衡:MongoDB有利于控制并发性,以照顾到其他服务器的多个客户端请求。这可以帮助减少每个服务器的负载,同时确保数据的一致性和正常运行时间,并允许可扩展的应用程序。

使用案例

MongoDB被全球数以千计的组织用于满足数据存储需求或作为其应用程序的数据库服务。

MongoDB在以下方面起着关键的作用:

  • 内容管理:通过MongoDB,你可以在一个数据库中服务和存储任何类型的内容,构建任何功能,并编织任何类型的数据。MongoDB为你的成功设置了商品硬件和更有生产力的团队,使你的项目成本为应有的10%,同时提供构建内容丰富的应用程序所需的所有功能。
  • 支付:如果你正在开发一个新的支付产品,MongoDB的数据敏捷性将使该新产品迅速进入市场,而你不必担心数据碎片化等不必要的复杂性。即使你正在领导一个试图使其支付生态系统现代化的成熟企业,你也可以利用MongoDB的灵活性,将其作为一个合并的操作数据层,使你能够使用现有的数据建立新的产品和服务,而不需要一个有风险的曲奇解决方案。
  • 个性化:MongoDB允许你实时地对数以百万计的客户进行个性化体验,其功能包括有针对性的优惠、定制的主页和社交媒体网络登录。你甚至可以直接针对你的数据运行复杂的查询,而不必担心转换、提取和加载的问题。
  • 主机卸载:你可以用MongoDB轻松地将工作负载从大型机上移开。主机卸载是将经常访问的主机数据复制到建立在MongoDB上的操作数据层(ODL)的过程,针对该层的操作可以从消费应用程序重定向。

什么是PostgreSQL?

The PostgreSQL logo, showing the text below a stylized blue elephant head outlined in black and white.

PostgreSQL的标志。(图片来源:Uberconf)

尽管NoSQL数据库很受欢迎,但关系型数据库由于其稳健性和强大的查询能力,仍然与各种应用有关。

在数据结构不经常变化的情况下,关系型数据库很适合运行复杂的查询和基于数据的报告。像PostgreSQL这样的开源数据库,与同时代的许可数据库如SQL Server和Oracle相比,作为一个稳定的生产级数据库,提供了一个经济实惠的选择。

PostgreSQL是一个高度稳定的数据库管理系统,有超过20年的社区开发支持,使其具有高度的完整性、弹性和正确性。你可以使用PostgreSQL作为各种移动、地理空间、分析和网络应用的主要数据仓库或数据源。

PostgreSQL也没有许可费用,消除了过度部署的风险。它的专门小组的爱好者和贡献者定期发现错误和解决方案,为数据库系统的整体安全提供了帮助。

主要特点

以下是PostgreSQL的一些突出特点,使其成为当今使用最广泛的数据库之一:

  • 非原子列:关系模型的主要约束之一是列需要是原子性的。然而,PostgreSQL没有这个约束,它允许列有子值,查询可以很容易地访问。
  • 对JSON数据的支持:查询和存储JSON的能力使PostgreSQL也可以运行NoSQL工作负载--比如说,如果你正在设计一个数据库来存储来自多个传感器的数据,而你不确定你需要支持各种传感器的特定列。在这种情况下,你可以构建一个表,使其中一列是JSON,以存储不断变化或非结构化的数据。
  • 窗口函数:PostgreSQL的窗口函数发挥了不可或缺的作用,使其成为分析应用程序的最爱。通过窗口函数,你可以执行跨越多行的函数并返回相同数量的行。窗口函数与聚合函数不同,因为聚合函数在聚合后只能返回一条记录。

使用案例

下面是一些PostgreSQL派上用场的使用案例:

  • 联合枢纽数据库:PostgreSQL的JSON支持和外来数据包装器允许它与其他数据存储连接--包括NoSQL类型--并作为一个联合的枢纽数据库系统。
  • 科学数据:科学和研究项目可以产生TB级的数据,这些数据必须得到最有效和有益的管理。PostgreSQL提供了一个出色的SQL引擎,具有强大的分析能力,这使得处理大量的数据变得小菜一碟。
  • 制造业:各种世界级的工业制造商利用PostgreSQL来加速创新,并通过以客户为中心的流程来推动增长,同时通过使用PostgreSQL作为存储后端来优化供应链的性能。
  • LAPP开源堆栈:PostgreSQL可以运行动态应用程序和网站,作为LAMP堆栈的强大替代方案的一部分。LAPP是指Linux、Apache、PostgreSQL、Python、PHP和Perl。

MongoDB与PostgreSQL。头对头的比较

真正的问题不是MongoDB对PostgreSQL,而是最好的文档数据库对最好的关系型数据库:

很多时候,在一个开发项目的初期,项目负责人对用例有很好的把握,但对用户和企业需要的具体应用功能并不清楚。他们最终不得不赌上一个选择,并希望它是最合适的。

在下一节中,我们将阐明MongoDB和PostgreSQL之间的差异,以帮助你轻松做出决定。我们的信息是基于一些关键因素,如架构、ACID兼容性、可扩展性、复制、安全性和支持等等。

让我们深入了解一下!

ACID兼容性

关系型数据库最关键的特征之一是ACID事务,它使编写应用程序更加简单。就数据库事务中的隔离级别而言,PostgreSQL默认使用读承诺隔离级别。它也允许用户调整读承诺的隔离级别,直到可序列化的隔离级别。

这里需要注意的是,事务允许对数据库的各种改变在一组中进行或回滚。因此,在关系型数据库中,数据将在表格模式中的独立父子表中建模。

相对而言,文档数据库更容易执行事务,因为它们将数据整理在文档中,由于读写是一个原子操作,所以不需要多文档事务。

当文档被更新时,MongoDB支持完全隔离。任何错误都会触发更新操作的回滚,逆转变化,确保客户获得一致的文档视图。

MongoDB还支持跨多个文档的数据库事务,允许相关变化的位被回滚或作为一个组提交。由于其多文档事务能力,MongoDB是少数几个将文档模型的灵活性、速度和力量与传统数据库的ACID保证结合起来的数据库之一。

架构/文档模型

MongoDB的文档模型允许用户自然地映射到应用程序代码中的对象,使其更容易被全栈开发人员学习和使用。文档为你提供了描绘层次关系的能力,以轻松存储数组和其他更复杂的结构。

通过在嵌套子文档和数组等字段中存储数据,JSON文档中的相关信息可以存储在一起,以便通过MongoDB查询语言进行快速查询访问。

通过MongoDB,你可以将数据存储为称为二进制JSON(BSON)的二进制表示法的文档。字段可以根据它所迎合的文档而有所不同,因此,不需要向系统声明文档的结构--文档是自我描述的。

如果你需要在文档中添加一个新的字段,那么该字段可以在不影响集合中其他文档或更新ORM或中央系统目录的情况下生成。

MongoDB还为你提供了模式验证的选项,以对每个集合实施数据治理控制。这种灵活性在整理来自多个不同来源的信息或适应文档随时间变化的修改时非常方便,特别是在新的应用功能被持续部署时。

PostgreSQL容纳了一个客户-服务器模型的架构,由以下两个过程组成:

  • 客户端进程:这些是用户利用的应用程序,与数据库进行交互。通常,它有一个简单的用户界面,用于通过API在用户和数据库之间进行通信。

  • 服务器端流程:这是 "Postgres "应用程序,处理操作、连接、动态和静态资产。一个正在运行的PostgreSQL网站是由Postmaster处理的,这是一个中央协调进程。Postmaster守护进程负责。

    • 执行恢复
    • 初始化服务器
    • 关闭服务器
    • 运行后台进程
    • 管理来自新客户的连接请求

    .

可扩展性

可扩展性是指在设计上允许增加新的能力或功能的质量。

PostgreSQL以多种方式支持可扩展性,包括存储函数和程序。使PostgreSQL具有广泛性的是其目录驱动的操作。

关系型数据库通常在系统目录中存储关于表、数据库、列等的信息。这些 "数据字典 "在用户看来是表,但它们确实有数据库系统内部存储的信息。

PostgreSQL存储了关于列和表的信息,以及关于数据类型、函数和访问方法的信息。

还有更多。PostgreSQL还可以通过动态加载将用户编写的代码纳入自身。通常,用户可能需要某些可以通过共享库实现的功能。用户可以简单地指定代码文件,PostgreSQL会根据需要加载它,从而使它独特地适合于新应用程序的快速原型设计。

另一方面,MongoDB最终变得可扩展,允许用户创建他们的功能并在框架内使用它们。这相当于用户定义函数(UDF),允许关系型数据库(如PostgreSQL)的用户扩展SQL语句。

此外,PostgreSQL和MongoDB都支持一些扩展和插件,如Adminer,用于数据库管理。

协作和敏捷性

MongoDB有一个文档模型,使协作和开发更容易和更快地实现。MongoDB本质上使用JSON或BSON将其数据存储为文档。

BSON包括JSON数据中不存在的几种数据类型,如DateTimelongintbyte 数组,这有助于更有效地处理数据,因为它将根据数据类型更加具体,而不是像通用的 "数字 "类型那样处理所有东西。它使查询执行得更快,因为它的序列化格式有效地归档了类似JSON的文件。

BSON跳过了对查询没有用的键,从而使数据的检索更快。用户可以进一步定义文档的结构,并通过引入新的字段、重新加工数据或在他们认为合适的时候进行一些开发。

这种灵活性对MongoDB来说是一个巨大的优势,因为它有助于避免要求管理员重组数据定义语言语句,然后通过重新创建或重新加载数据库从头开始造成的延误。

MongoDB还使开发人员或团队之间的协作变得容易,因此,团队之间不需要中介或复杂的沟通。

说到协作,PostgreSQL包括用户级权限、角色继承和表级权限。你可以管理用户,并授予他们读和写的权限。

此外,你还可以通过审计选项审查各种组或用户的数据访问活动,这可以授予一个额外的安全层。然而,PostgreSQL没有MongoDB那么快,因为它是一个以行和列存储数据的关系型数据库。

外键支持

使MongoDB区别于PostgreSQL的一个关键特征是它存储数据的方法。

由于它是非关系型数据库,MongoDB使用集合而不是表。外键只是在一个表中的一组属性,指的是另一个表的主键。外键将这两个表相互连接起来。

由于MongoDB中没有表,所以MongoDB中也没有外键;因此没有外键约束。然而,MongoDB确实有一个DBRef标准,它有助于规范引用的创建。

另一方面,PostgreSQL支持外键,因为它是与SQL兼容的。通过启用外键约束,PostgreSQL可以阻止无效的数据插入到外键列中。

分区和分片

分区和分片本质上是将大型数据集分解成较小的子集。分片意味着数据被存储在多台计算机上,而分区则是将这些数据分组在一个数据库实例中。

MongoDB是可扩展的,因为它在集群内的实例之间进行数据分区。它不会将文件分割成碎片,因为它们是独立的单位,使其更容易在不同的服务器上分发,同时数据被保存在本地。

数据可以通过MongoDB Atlas云服务轻松地分布在不同地区。你也可以选择在特定区域或全球区域不断地存储它们,以确保减少延迟。

自5.0版本以来,MongoDB已经包含了一个 "实时 "重放功能,由于你只需要设置一个策略,所以它是一个主要的时间节省者。当时间到了,数据库可以自动重新分配数据。

以前,你可以在不关闭系统的情况下这样做,但这个过程很复杂,而且有风险。虽然MongoDB在一段时间内确实有全球地理分区的功能,但不同国家的数据增长速度是不同的。对于那些必须在一个国家内保持本地的数据来说,实时重新分区可能是有益的。

另一方面,PostgreSQL支持声明式分区,这本质上是一种指定如何将一个表划分为分区的方式。被分割的表称为被分割的表,该规范由分割方法组成,要使用的列或表达式列表称为分割键。

你可以通过一个范围来实现分区,表可以通过一个键列或一组列定义的范围来分区,分配给不同分区的值范围之间没有重合。

你也可以实现列表分区,其中表是根据指定的键值进行分区的。

复制

复制是在一个以上的服务器上创建同一数据集的副本的过程。它使数据库管理员能够提供高数据冗余度和高数据可用性。

对于MongoDB,这是通过使用 "复制集 "来实现的--一个由三个或更多服务器组成的同步集群,在它们之间不断复制数据。这提供了冗余和保护,以防止在预定的维护休息或系统故障时可能发生的任何停机,从而提高数据库的容错性。

复制集也可以在不同的数据中心之间实现,因为它们在区域性故障的情况下会派上用场。这可以通过MongoDB Atlas来完成,它使构建和配置这些集群更加简单和快速。

PostgreSQL提供主-次复制。写在前面的日志能够与复制节点共享所做的改变,因此使异步复制成为可能。其他类型的复制包括逻辑复制、流式复制和物理复制。

索引

索引是允许我们更快地检索特定行或数据的对象或结构。

PostgreSQL提供了一系列独特的索引类型,以有效地匹配任何查询工作负载。它的索引技术包括B-树、多列和表达式。此外,部分和高级索引技术,如GiST、KNN Gist、SP-Gist、GIN、BRIN、覆盖索引和Bloom过滤器也可以在PostgreSQL中实现。

另一方面,MongoDB允许你将数据存储在任何可以通过索引快速访问的结构中,无论在数组或子文件中嵌套多深。

语言与语法

MongoDB和PostgreSQL都支持各种语言。

MongoDB为一些最好的数据库语言提供驱动支持,如Python、R、Java、Scala、C、C++、C#、Node.js等。这些MongoDB库和驱动支持MongoDB的所有功能,在所有应用程序中给予高性能和可扩展性。

PostgreSQL支持几种程序性语言的基本分布,如PL/pgSQL、PL/Python、PL/Perl和PL/Tcl,以及在PostgreSQL核心分布之外开发和维护的其他语言,如PL/Java、PL/PHP和PL/Ruby。

规范化

归一化是对关系型数据库进行结构化的过程,以减少数据冗余,尽量减少数据修改中的异常,并提高数据的完整性。

MongoDB可以处理规范化和非规范化的数据模型(也被称为嵌入式模型)。

嵌入模型允许应用程序在同一个数据库记录中存储相关的信息,这将为读取操作提供更好的性能,并能够在单个数据库操作中检索相关数据。

此外,你也可以在一个单一的原子写操作中更新相关数据,而应用程序发出更少的查询来完成普通操作。MongoDB中嵌入数据模型的文档必须小于BSON文档的最大尺寸(16MB)。

规范化的数据模型使用文档之间的引用来描述关系。当嵌入可能导致数据重复,但读取性能优势不足,超过了重复的影响时,这将是有益的使用。

然而,当数据库中先前规范化的数据被分组以提高性能时,去规范化过程通常会导致高内存消耗。

纠结于停机时间和WordPress问题?Kinsta是旨在为您节省时间的托管解决方案看看我们的特点

PostgreSQL的模式有一个确定的关系。该结构可以用1:1、1:许多或许多:1的关系来识别。数据的规范化可能是非常有益的,因为它消除了数据的冗余副本,从而也确保了完整性。

性能

评估两个不同的数据库系统的性能是具有挑战性的,因为MongoDB和PostgreSQL都有不同的存储和检索数据的方式。

MongoDB是为了横向扩展而建立的,因为它经常将自己的力量与额外的机器结合起来,并且不依赖处理能力。它能够为大规模的应用提供动力,无论它是以数据大小还是用户来衡量。

MongoDB也能适应需要快速执行查询的用例,并能处理大量的数据。它可以纳入数百台机器的整体。

自MongoDB 4.4以来,针对复制集实施的查询通过 "对冲 "读取产生了改进和可预测的性能。这些读取被引导到复制集内的多个节点,直到最快的节点回复。

PostgreSQL虽然在原始插入速度方面不如MongoDB快,但在ACID兼容性方面却很出色。交易的处理是安全和可靠的,允许整个交易失败,而不是执行部分成功的写入。

MongoDB最近才开始支持类似于SQL数据库的ACID事务(版本4)。

与MongoDB不同的是,PostgreSQL在数据量和写量的扩展上依赖于一种扩展策略(垂直扩展)。它是通过向现有的数据库节点添加更多的硬件资源,如磁盘、CPU和内存来进行的。

然而,PostgreSQL在性能优化方面做了一些努力,包括一个成熟的查询计划器、表达式的即时编译(JIT)、表的分区和读取查询的并行化。

价格

PostgreSQL是完全免费的,并且是开源的。因此,任何人都可以使用它的功能,并在必要时轻松地对代码进行修改。

MongoDB也是一个开源的工具。然而,MongoDB确实有其他选项,比如企业版和Atlas(用于云端),它们的价格各不相同。为MongoDB企业版提供了一个内部定价模式。

Mongo RealmDB免费提供给所有Atlas用户用于评估和轻度使用,使开发者能够构建和发布移动应用程序。

MongoDB Realm pricing options compute, sync, request, and transfer listed in a tabular format.

Mongo RealmDB的定价选项。(图片来源:MongoDB定价)

数据迁移也可能产生开销;但是,无论你在系统中实施何种数据库,这都是标准的。

查询处理

PostgreSQL使用关系型数据库模型,该模型依赖于在表内存储数据,并利用结构化查询语言(SQL)进行数据库访问。SQL命令可以使用PostgreSQL终端psql输入。它有一个大对象设施,提供对用户数据的流式访问,这些数据被存储在一个特殊的大对象结构中。

在添加数据之前,必须建立数据库模式,以清楚地了解数据关系来处理查询。相关的信息可以存储在数据库中的独立表中。这可以通过外键和连接来访问。

一旦加载数据库的结构,就很难调整。它需要开发、运营和数据库管理员的几个团队来仔细协调在结构上的变化。

另一方面,MongoDB的数据结构不需要提前计划,因为它基本上是处理非结构化数据。数据结构的调整也要容易得多。

开发人员可以选择应用程序中的重要内容,并进行所需的修改。MongoDB使用MQL,它可以用来处理MongoDB中的文档并取出数据,同时提供SQL所具有的灵活性和力量。

MongoDB将数据处理为JSON文档。你也可以对JSON文档内的字段进行查询。因此,MongoDB在你想在一个灵活的数据字段内存储文档的情况下相当有用。

虽然PostgreSQL使用GROUP_BY 函数来处理和运行聚合查询,但MongoDB通常使用聚合管道来处理其查询。

然而,MongoDB的一个主要缺点是,你不能轻易地连接表。在PostgreSQL中,通过JOIN语句就可以实现简单的连接。

MongoDB试图通过引入多维数据类型来解决这个问题,你可以将一个文档存储嵌入到另一个文档存储中。然而,它是杂乱无章的,不像PostgreSQL包含的简单的join 功能那样优雅。

安全性

涉及到安全问题时,PostgreSQL胜过MongoDB。管理数据库结构的严格规则使PostgreSQL成为一个非常安全的数据库,因此它可以被可靠地用于银行系统。

PostgreSQL提供了大量的认证方法,包括可插拔认证模块(PAM)和轻量级目录访问协议(LDAP),这些方法减少了服务器的攻击面。它还通过基于主机的认证和证书认证确保服务器级别的保护。

此外,PostgreSQL提供数据加密,并允许你在数据通过网络或公共网络高速路传输时使用SSL证书。PostgreSQL还可以让你实现客户证书认证(CCA)工具作为一个选项,并使用加密功能在PostgreSQL中存储加密数据。

然而,PostgreSQL的安全级别在不同的云系统中可能有所不同,即使是同一个数据库。

MongoDB Atlas在三个最大的云供应商中表现相同,使多个云之间的迁移更容易。

此外,MongoDB有客户端和字段级的加密,这使得用户在通过网络将数据发送到数据库之前可以对其进行加密。然而,由于数据是以键值对存储在一条记录中,它缺乏PostgreSQL所夸耀的安全性;MongoDB的主要重点仍然是速度。

支持和社区

PostgreSQL是完全开源的,由其社区支持,这加强了它作为一个完整的生态系统。PostgreSQL经常定期发布更新版本,开发者、爱好者或第三方公司提供支持,并试图通过修复错误或对数据库系统进行轻微修改来发展该系统。

与PostgreSQL一样,MongoDB也有一个社区论坛,使用户能够与其他几个用户联系,并得到他们的一般询问的回答。MongoDB企业支持可以进一步包括一个广泛的知识库,包括使用案例、详细的教程、优化的技术说明和最佳实践。

此外,还有由MongoDB提供的培训和认证的在线课程,是免费的。

挑战

虽然我们已经讨论了MongoDB和PostgreSQL的特点,使它们受到开发者的欢迎,但它们也有各自的弱点。

MongoDB倾向于专注于快速的数据操作,但缺乏PostgreSQL似乎拥有的数据安全性。它对内存的要求相当高,因为反规范化过程通常会导致高内存消耗。

此外,由于不支持连接,MongoDB数据库的数据供应过多--有时是重复的--因此对内存造成了严重的负担。MongoDB还试图将解释纳入其他查询语言,作为其可扩展性的一部分;然而,这可能会降低其性能,因为数据库最初不是为处理关系型数据模型而建立。

将SQL翻译成MongoDB查询可能需要额外的时间来使用该引擎,这可能会延迟部署和开发。

另一方面,虽然PostgreSQL很容易安装,并能适应几乎所有的平台,但其效率可能因平台不同而不同。此外,它没有修改工具或报告工具,可以显示数据库的当前状况。如果有什么事情没有按计划进行,你可能必须不断地检查数据库,以避免在太晚的时候才注意到故障。

PostgreSQL也有点慢,因为它专注于兼容性。虽然已经努力提高PostgreSQL的速度,但修改后仍需要更多的工作。

MongoDB vs PostgreSQL。你应该选择哪个?

MongoDB是一个非关系型数据库,而PostgreSQL是一个关系型数据库。NoSQL数据库的工作是将数据以键值对的形式存储为一条记录,而关系型数据库则将数据存储在不同的表中。

如果你优先考虑更快的数据整合和在多个服务器上的可扩展性,MongoDB可能是你业务的合适选择。

MongoDB在整合到分析平台时可以发挥最佳效果,因为MongoDB的速度提供了动态性能,可以帮助实时跟踪用户的行为。如果你碰巧拥有一个繁忙的网络应用程序,不依赖于像《纽约时报》那样的结构化模式(事实上,它确实使用了MongoDB),或者用于产品目录,你会需要存储具有各种属性集合的多个对象,那么它也会对你的业务非常有利。

另一方面,PostgreSQL是数据分析和仓储的完美搭配。如果你正在建立一个数据库自动化工具或一个银行应用程序,你希望数据安全和交易保证得到执行,那么PostgreSQL可能是最合适的。

总结

总而言之,到目前为止,我们已经涵盖了PostgreSQL和MongoDB的基本细节。我们已经讨论了它们的历史、主要特征以及它们的不同之处。

虽然PostgreSQL和MongoDB都是了不起的数据库,但最终还是要选择适合你业务的数据库。