首頁>技術>

在日常生活中,許多人都是在基於他們已經知道的事物基礎上,去學習或瞭解新的事物。這是人類的天性。同樣,在產品和技術方面,人們需要事先找到一個基線作為起點,然後問出類似:“相對於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的各種產品功能,進行了擴充套件與市場融合,填補了其中的空白與短板,併為開發人員提供了實用且高效的工具。

22
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • MongoDB Go驅動程式入門,看完你也會