HarperDB vs MongoDB vs PostgreSQL差异总结

1,032 阅读8分钟

HarperDB vs MongoDB vs PostgreSQL

许多人学习或理解新事物都是相对于他们已经知道的事物而言的。这很有道理,这可能是一种自然本能。当涉及到产品和技术时,很多人都会问 "你们有什么不同",但与什么不同?你需要某种基线来开始,所以你可以说,"与X类似,但因为Y而不同"。正因为如此,比较、竞争分析和特征矩阵是了解哪些技术解决方案适合你的一个好方法。因此,今天让我们对三个不同的数据库系统做一个比较。

正如我在《数据库架构与用例》一文中所说。在大多数情况下,并不是一个数据库比另一个好,而是由于许多因素,一个数据库更适合于特定的用例。这篇文章的重点不是确定哪个数据库是最好的,而是帮助揭示为你的特定项目选择数据库时需要考虑的因素。由于MongoDB和PostgreSQL是目前最流行的两个工具,你可能已经知道有大量的资源在比较这两者。然而,由于HarperDB是一个新的数据库,我想把它扔到混合中来提供进一步的澄清可能会有帮助。

再参考一下我的数据库架构概述帖子。了解诸如数据类型/结构、数据量、一致性、写入和读取频率、托管、成本、安全性和集成约束等方面的问题是很重要的。那篇文章为所有不同类型的数据库提供了一个很好的高水平解释,但今天我们将变得更加具体。


相似性

这些技术都是相似的,它们都是用来存储数据的,但这个简单的概念就是相似之处的终点。然而,虽然MongoDB和PostgreSQL实际上彼此之间有很大的不同,但HarperDB位于中间的某个地方。

如前所述,外面有许多资源在比较MongoDB和PostgreSQL,它们都是很棒的数据库。这篇来自Educative的文章是了解它们之间差异的一个好地方。因此,为了避免重复,在这篇文章中,我将更多地关注HarperDB与这两者的比较。


定义

MongoDB被归类为NoSQL数据库。它是面向文档的,使用类似JSON的文档,有可选的模式。

PostgreSQL是一个传统的RDBMS(关系型数据库管理系统)。主要用于关系型数据,它在本质上是面向对象的。

HarperDB是一个具有REST API和动态模式的分布式数据库,它支持NoSQL和SQL,包括连接。(例如,你可以通过NoSQL的JSON输入数据,然后立即通过SQL查询)。


差异概述

MongoDB与PostgreSQL。PostgreSQL是一个处理更复杂的程序、设计和整合的关系型数据库。MongoDB是一个NoSQL数据库,通常用于更简单、更非结构化的数据,非常适合应用开发。最终,PostgreSQL执行模式验证,而Mongo则没有。

HarperDB vs. MongoDB:MongoDB是一个文档存储,非常适合非结构化数据,而HarperDB则提供完整的文档存储能力和企业级ACID SQL。基准测试发现,HarperDB比Mongo快37倍,而价格却不到Mongo的一半。HarperDB还有一个原生的REST API,支持JSON的SQL,并且更容易使用和管理。请看完整的基准测试。(Mongo对大规模的写入进行了优化,但对读取没有优化。HarperDB的数据存储算法写在LMDB之上,可以同时实现大规模的读和写,导致整体的高性能)。

HarperDB v. PostgreSQL。HarperDB比PostgreSQL更灵活,PostgreSQL对于复杂的数据或严格的一致性来说是一个很好的技术,但是HarperDB简化了很多安装、配置和管理方面的工作。HarperDB正在允许来自关系型背景的开发人员使用他们现有的SQL知识,同时允许他们的团队从相同的数据模型中使用NoSQL。


可访问性

MongoDB、PostgreSQL和HarperDB都可以在任何地方运行;在云端、本地、数据中心等(没有像HarperDB Cloud和MongoDB Atlas那样的PostgreSQL云,但云供应商提供PostgreSQL即服务)。


引擎盖下

MongoDB主要是用C、C++和JavaScript语言编程的。PostgreSQL主要用C语言编程,HarperDB用Node.js编写(LMDB用C语言编写,安装过程中使用Python)。

MongoDB在引擎盖下使用BSON(二进制JavaScript对象符号),以使查询快速进行。然后将其翻译成JSON,以便在你打开你的集合时读取。

PostgreSQL最终采用了SQL,一种结构化的查询语言,来定义、访问和操作数据库。PostgreSQL也有一个JSON数据类型。

HarperDB不强制执行数据类型,它目前将所有的数据属性存储为字符串,数据可以通过SQL和/或NoSQL进行查询。(HarperDB也正在努力使管理员能够明确地设置属性类型(作为数字或字符串),以便进行性能调整)。


数据存储和架构

MongoDB将数据存储为单独的文档而不考虑属性,PostgreSQL将数据存储在传统的表和行中,而HarperDB将数据存储在表和行/对象中,并默认对所有顶级属性进行索引。

HarperDB有一个独特的数据存储算法,运行在LMDB之上,这使得HarperDB能够在一个产品中摄取JSON文档和关系型数据。当数据进来时,HarperDB将其映射到数据模型中;它不是一个SQL引擎或NoSQL引擎。(无论数据如何被摄取,数据都是根据HarperDB的数据模型来存储的,并且可以通过SQL或NoSQL来查询)。

MongoDB和HarperDB是更多的分布式架构,而PostgreSQL可能被认为是一个单一的架构。


ACID属性(原子的、一致的、隔离的和持久的)

HarperDB和PostgreSQL都有企业级的ACID SQL事务,这意味着数据的有效性是相当可靠的。

像MongoDB这样的NoSQL数据库通常采用最终一致性而不是ACID属性。(2020年5月的一项研究发现了一个错误,对Mongo符合ACID的说法提出异议,因为MongoDB的事务不是完全隔离的)。

HarperDB和PostgreSQL都遵循ANSI SQL的标准。


模式和表

在MongoDB和HarperDB中,使用JSON允许你灵活地改变你的模式而不产生后果。文件可以在键/值对方面有所不同。

MongoDB和HarperDB都是横向扩展的,这使得速度得到提高。HarperDB有双向的表级数据复制。HarperDB使用一个简单的pub-sub模型;数据是通过发布数据到不同的 "聊天室 "来复制的,不同的节点订阅这些聊天室,并且能够水平分布。

PostgreSQL是纵向扩展的(当它变大时,需要更多的空间或更多的内存),因此它需要停机来升级。

对于像PostgreSQL这样的关系型数据库,改变你的表是必须的,以进行任何改变。整个模式需要在创建时进行设计和配置。你也许可以在以后改变一个表,但这可能会导致数据库停机,并在你的应用程序中产生错误。PostgreSQL数据库可以使用外键,外键明确地连接表之间的数据,用于保持数据的正常化。


使用案例及总结

正如本文所述,由于PostgreSQL的交易遵循ACID属性,它是金融科技等行业的一个很好的选择。当你绝对需要控制数据的状态时,请使用Postgres这样的关系型数据库。另外,如果你只有非结构化数据,或者正在处理大数据,使用MongoDB这样的工具进行水平扩展可能是一个好主意。

HarperDB可能比现有系统更适合的用例包括:需要SQL和NoSQL的项目、快速应用开发、混合云、集成、边缘计算、分布式计算、实时分析和高交易。当HarperDB不适合你的特定项目时,我们的团队也会第一时间告诉你。当你需要全文索引、高度结构化的关系型数据、跨系统的严格一致性,或者不信任开发人员约束和维护数据的项目时,不建议使用HarperDB。

MongoDB和PostgreSQL对于某些用例来说确实是很好的工具。他们受到很多人的喜爱,HarperDB的团队感谢他们为像我们这样的技术的存在铺平了道路。HarperDB的创建是为了扩展和融合市场上出色的SQL、NoSQL和NewSQL产品的能力,以填补空白,并确保开发人员能够持续地使用正确的工具来完成工作。