三大流行数据库(MongoDB、PostgreSQL和Harper)大比拼
在日常生活中,许多人都是在基于他们已经知道的事物基础上,去学习或了解新的事物。这是人类的天性。同样,在产品和技术方面,人们需要事先找到一个基线作为起点,然后问出类似:“相对于X,那么Y到底有哪些不同呢?”等问题。下面,我们将按照这样的思路,以当前流行的MongoDB和PostgreSQL两大数据库系统为参照,引入Harper这一全新的数据库,并对三者的功能、结构、以及适用场景进行比较。
总体而言,在大多数情况下,鉴于多方面因素的考虑,我们并不需要得出“哪家数据库最强?”的结论,而是要探索出在为特定项目选择数据库时,需要考虑的各种因素和适用场景。
定义
MongoDB被分类为NoSQL数据库。由于使用的是类似JSON的文档,作为可选的模式集合(schema),因此它是面向文档(document-oriented)的。
PostgreSQL是传统的RDBMS(relational database management system,关系数据库管理系统)。由于主要被用于关系型数据,因此它本质上是面向对象的。
HarperDB是具有REST API和动态模式集合的分布式数据库。它支持NoSQL和包括联合(joins)功能在内的SQL。例如,您可以通过NoSQL JSON来提取数据,并立即通过SQL进行查询。
差异概述
MongoDB与PostgreSQL:作为一个关系型数据库,PostgreSQL可被用于处理更为复杂的过程、设计和集成。而作为一个NoSQL数据库,MongoDB通常被用于简单、非结构化的数据场景,同时也非常适合于大数据应用程序的开发。PostgreSQL能够强制执行模式集合的验证,而Mongo则不然。
HarperDB与MongoDB:作为一种文档存储,MongoDB非常适合非结构化数据;而HarperDB提供了完整的文档存储功能,以及企业级的ACID SQL,即:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、和持久性(Durability)。基准测试(Benchmark test)发现,HarperDB比Mongo快37倍,而价格却不到其一半。HarperDB不但具有原生的REST API,支持针对JSON的SQL,而且更易于使用和管理。Mongo虽然已针对大规模的写操作进行了优化,但是并未针对读操作采取任何优化。而针对LMDB(Lightning Memory-Mapped Database)编写的HarperDB数据存储算法,可实现大规模的读和写操作,进而提高整体性能。
HarperDB与PostgreSQL:PostgreSQL是善于处理复杂数据或严格的一致性。而HarperDB比PostgreSQL更灵活,它简化了大量的安装、配置和管理工作。HarperDB不但允许那些具有关系型数据库背景的开发人员继续沿用SQL技能,还允许他们使用来自同一数据模型的NoSQL。
辅助功能
MongoDB、PostgreSQL和HarperDB均可在云端、本地、以及数据中心等任何地方运行。PostgreSQL虽然不像HarperDB Cloud和MongoDB Atlas那样有云端版本,但是各个云提供商会提供所谓的PostgreSQL即服务(PostgreSQL-as-a-service)。
深入了解
MongoDB主要适用于C、C++和JavaScript语言编程;PostgreSQL则主要适用于C语言编程;而HarperDB适用于Node.js的编写。此外,LMDB不但适用于C语言的编写,而且在安装过程中使用到了Python。
MongoDB在后台采用BSON(binary JavaScript Object Notation,二进制JavaScript对象表示法),来加快查询的速度。在您打开集合时,它会转换为JSON以便被读取。
PostgreSQL采用SQL(一种结构化查询语言)来定义、访问和操作数据库。当然,PostgreSQL也有一个JSON数据类型。
HarperDB对数据的类型并无强制性要求。它当前存储的所有数据属性均为字符串,而且可以通过SQL和(或)NoSQL来查询数据。同时,HarperDB也致力于让管理员能够显式地设置属性类型(如:数字或字符串型),以方便性能的调优。
数据存储与架构
MongoDB将数据存储为单独的文档,而并不考虑其属性。PostgreSQL将数据存储在传统的表和行中。而HarperDB则将数据存储在表、行、以及对象中,并且所有顶级属性在默认情况下都已经建立了索引。
HarperDB能够将独特的数据存储算法运行在LMDB上。这使得HarperDB可以在单个产品中,提取JSON文档和关系型数据。HarperDB会持续将传入的数据,映射到数据模型中。而无论传入的数据是何种类型,它们都会根据HarperDB的内部数据模型来予以存储,并方便了开发人员通过SQL或NoSQL进行查询。
此外,MongoDB和HarperDB都具有分布式的体系架构,而PostgreSQL则被视为一种单体架构。
ACID属性
由于支持企业级的ACID SQL事务,因此数据在HarperDB和PostgreSQL内具有可靠的有效性。而像MongoDB之类的NoSQL数据库,通常注重的是终极一致性,而非ACID整体属性。2020年5月,有一项研究发现了MongoDB未对交易进行完全隔离的错误,进而确证了它不符合ACID。当然,HarperDB和PostgreSQL都能够遵循ANSI SQL标准。
模式集合和表
对于MongoDB和HarperDB而言,通过使用JSON,您可以灵活地更改架构,而不会产生任何后果。当然,对应的文档可能会在键/值方面有所不同。
MongoDB和HarperDB都可以通过水平方向的扩展,来提高速度与性能。其中,HarperDB具有双向表级(bidirectional table-level)的数据复制特性。通过使用HarperDB简单的pub-sub模型,您可以订阅和复制数据的方式,将数据水平发布到不同节点处。
PostgreSQL可以垂直方向扩展。随着数据库的变大,它会需要更多的空间或内存,因此对应的停机时间也会增加。也就是说,对于PostgreSQL之类的关系型数据库,您与其在事后更改表的结构,并可能导致数据库的停机,以及应用服务的中断,不如在系统上线之前,就对整个架构进行完善的设计和配置。此外,PostgreSQL数据库可以使用外键,来显式地链接表与表之间的数据,以用于保持数据的规范化。
使用场景
如前文所述,由于PostgreSQL中的事务能够遵循ACID属性,而对于金融科技(fintech)之类的行业而言,他们需要对数据的状态拥有绝对的控制权,因此Postgres之类的关系型数据库是不错的选择。
如果您仅具有非结构化的数据,或是正在使用大数据,那么最好将水平扩展的方法,与MongoDB之类的工具协同使用。
相对于现有的数据库系统,HarperDB更适合于同时需要SQL和NoSQL,快速应用开发与集成,边缘计算,分布式计算,实时分析,以及高度事务性(high transactions)处理的项目。当然,如果您需要全文索引、高度结构化的关系型数据、跨系统的严格一致性、以及约束开发人员访问或维护某些数据项目的话,HarperDB就不太适用了。
小结
总的说来,吸收了MongoDB和PostgreSQL各项优点的HarperDB,对SQL、NoSQL、以及NewSQL的各种产品功能,进行了扩展与市场融合,填补了其中的空白与短板,并为开发人员提供了实用且高效的工具。
原文标题:HarperDB vs MongoDB vs PostgreSQL,作者:Margo McCabe
原文地址:https://www.51cto.com/article/635497.html