東坑網(wǎng)頁設(shè)計seo技巧
本文為「數(shù)據(jù)庫全方位對比系列」第二篇,該系列的首部作品為「全方位對比 Postgres 和 MySQL (2023 版)」
為何對比 Postgres 和 MongoDB
根據(jù) 2023 年 Stack Overflow 調(diào)研,Postgres 已經(jīng)成為最受歡迎和渴望的數(shù)據(jù)庫了。
MongoDB 曾連續(xù) 4 年 (2017 - 2020) 蟬聯(lián)此頭銜。根據(jù) DB-Engines 排名,Postgres 和 MongoDB 都是排名前 5 的數(shù)據(jù)庫。它們兩者都在爬樓梯,并且在奪取三大巨頭:Oracle, MySQL 和 Microsoft SQL Server 的市場份額。
MongoDB 被廣泛認(rèn)為是一種與包括 Postgres 在內(nèi)的 SQL 數(shù)據(jù)庫相對立的 NoSQL 數(shù)據(jù)庫。但近年來,它們正在趨同:
- MongoDB 變得更像傳統(tǒng)關(guān)系型數(shù)據(jù)庫,增加了多文檔 ACID 事務(wù),二級索引和高級查詢功能。
- Postgres 不斷改進(jìn)其 JSON 能力,如索引、查詢優(yōu)化和更多操作符,這不禁讓人們好奇 MongoDB 是否已經(jīng)過氣。
2018 年,The Guardian 寫了一篇關(guān)于將 MongoDB 遷移到 Postgres 的長文。自此,雖然發(fā)生了很多變化,但有一件事沒變:遷移數(shù)據(jù)庫是極其痛苦的。
因為需要與各種數(shù)據(jù)庫及其衍生產(chǎn)品集成,Bytebase 和各種數(shù)據(jù)庫密切合作,而最大的數(shù)據(jù)庫托管服務(wù) Google Cloud SQL (https://cloud.google.com/sql) 也是 Bytebase 創(chuàng)始人的杰作之一。
根據(jù)實操經(jīng)驗,我們對 Postgres 和 MongoDB 在以下幾個維度進(jìn)行了比較:
- 許可證 License
- 數(shù)據(jù)模型 Data Model
- JSON 支持 JSON Support
- 性能 Performance
- 可靠性 Reliability
- 伸縮性 Scalability
- 易用性 Usability
- 可運(yùn)維性 Operability
- 生態(tài)系統(tǒng) Ecosystem
除非另有說明,下文基于最新的主要版本 Postgres 15 和 MongoDB 6。在文章中,我們使用 Postgres 而不是 PostgreSQL,雖然 PostgreSQL 才是官方名稱,但被認(rèn)為是 Postgres 史上最錯誤的決定。
許可證 License
- Postgres 發(fā)布在 PostgreSQL 許可下,是一種類似于 BSD 或 MIT 的自由開源許可。
- MongoDB 社區(qū)版采用由 MongoDB 公司自行創(chuàng)建的 Server Side Public License (SSPL) 發(fā)布,以防止他人提供競爭性的 MongoDB 服務(wù),MongoDB 公司還根據(jù)要求提供商業(yè)許可證。
大多數(shù)公司使用數(shù)據(jù)庫來支持其內(nèi)部基礎(chǔ)設(shè)施,Postgres 和 MongoDB 都允許此類使用。
數(shù)據(jù)模型 Data Model
- Postgres 是關(guān)系型數(shù)據(jù)庫,它將數(shù)據(jù)存儲在預(yù)先定義好的列中,并通過使用外鍵來建立表之間的關(guān)系。
- MongoDB 是面向文檔的數(shù)據(jù)庫,這意味著數(shù)據(jù)以文檔形式存儲在集合中。每個文檔都是一個類似 JSON 的結(jié)構(gòu),可以包含嵌套字段和數(shù)組。MongoDB 專為處理非結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)而設(shè)計。
Postgres 也支持 JSON 列,因此可以像使用 MongoDB 一樣使用 Postgres,將表定義為:
CREATE TABLE my_collection (id SERIAL PRIMARY KEY,data JSONB
);
JSON 支持 JSON Support
MongoDB 和 Postgres 都非常擅長處理 JSON。MongoDB 使用自己發(fā)明的 BSON 格式存儲 JSON,而 Postgres 使用 JSONB 格式。如果有興趣,可以看下這個關(guān)于選擇在 Postgres 中使用 BSON 還是 JSONB 之間的討論:https://bit.ly/3pRLOzi。
MongoDB 有兩個優(yōu)點:
- 內(nèi)置 schema 驗證器。
- 與 Node.js / 前端生態(tài)系統(tǒng)的集成。MongoDB 是全棧開發(fā)人員常用的選擇,他們通常會使用 Node 進(jìn)行開發(fā)。
性能 Performance
性能主要由訪問模式?jīng)Q定。如果一個操作涉及不同的實體,MongoDB 通常更快,因為數(shù)據(jù)是 denormalized 的,并且不需要在表之間進(jìn)行復(fù)雜的連接操作。另一方面,Postgres 能處理復(fù)雜查詢,這得益于 SQL 和其先進(jìn)的查詢優(yōu)化器。
可靠性 Reliability
MongoDB 在早期因為不支持 ACID 事務(wù)而被認(rèn)為是不太靠譜的。不過自從他們收購了 WiredTiger 并使用其 WiredTiger 存儲引擎后,就不一樣了。從事務(wù)角度來看,如今的 MongoDB 和 Postgres 一樣穩(wěn)定可靠。
MongoDB 通過其副本集提供內(nèi)置的自動 failover 功能。而 Postgres 則需要像類似 pg_auto_failover 的第三方解決方案。
伸縮性 Scalability
MongoDB 可以進(jìn)行橫向擴(kuò)展 (scale out),而 Postgres 通常則是縱向擴(kuò)展 (scale up)。
MongoDB 是一個支持自動分片的分布式數(shù)據(jù)庫。對于 Postgres 來說,我們通常會先將單節(jié)點的 postgres 進(jìn)行縱向擴(kuò)展,并盡可能地推遲使用分片解決方案。當(dāng)然,對 Postgres 進(jìn)行分片是可以的:
- 分片和 ID 在 Instagram 的使用
- 馴服大象:Notion 在 Postgres 上進(jìn)行分片的經(jīng)驗教訓(xùn)
易用性 Usability
MongoDB 不會事先強(qiáng)制 schema,并且容易上手。在 2010 年,10gen(開發(fā) MongoDB 的公司的原名)發(fā)布了官方 MongoDB Node.js 驅(qū)動程序的第一個版本,開發(fā)人員能輕松地從 Node.js 應(yīng)用程序與 MongoDB 數(shù)據(jù)庫進(jìn)行交互。該驅(qū)動程序提供了一個簡單直觀的 API,支持廣泛的 MongoDB 功能,包括查詢、索引和聚合等。正因為好用,如今,MongoDB 仍是全棧開發(fā)人員首選。
作為關(guān)系型數(shù)據(jù)庫,Postgres 強(qiáng)制對 schema 進(jìn)行了約束。而即使在關(guān)系型數(shù)據(jù)庫中,Postgres 也比其他產(chǎn)品如 MySQL 更加嚴(yán)格。
Stack Overflow 的調(diào)查顯示,盡管 Postgres 是受訪者中最受歡迎的數(shù)據(jù)庫,但 MongoDB 在新手中更受歡迎。
而在處理復(fù)雜查詢方面,MQL (MongoDB Query Language) 則不如 SQL 強(qiáng)大。
可運(yùn)維性 Operability
運(yùn)行多節(jié)點的 MongoDB 比運(yùn)行多節(jié)點的 Postgres 更容易,因為分片和 failover 可以由 MongoDB 來處理。不過,如果你在單個節(jié)點上分別運(yùn)行這兩個數(shù)據(jù)庫,那么 MongoDB 的分布式特性可能會成為負(fù)擔(dān)。
各種第三方供應(yīng)商提供了 Postgres 托管服務(wù)。MongoDB 的 License 阻止了第三方提供 MongoDB 托管服務(wù),不過他們自己的 MongoDB Atlas 比對應(yīng)的 Postgres 托管服務(wù)更加完善。畢竟,第三方很難擊敗第一方云服務(wù)。
生態(tài)系統(tǒng) Ecosystem
Postgres 有可擴(kuò)展的架構(gòu),并且仍由社區(qū)維護(hù)。近年來,Postgres 生態(tài)系統(tǒng)蓬勃發(fā)展,它擁有眾多插件,使其能夠處理比其他數(shù)據(jù)庫更多樣化的任務(wù)。而且由于其自由許可證和堅實的架構(gòu),在每個應(yīng)用程序平臺提供托管數(shù)據(jù)庫服務(wù)時,它們都選擇了 Postgres,從早期的 Heroku 到新興的 Supabase, render 和 Fly.io。
MongoDB 作為市值最高的商業(yè)開源企業(yè)采取了更商業(yè)化的做法。一旦在生態(tài)系統(tǒng)中出現(xiàn)了優(yōu)秀解決方案,MongoDB 公司都會考慮收購以確保其成為整體 MongoDB 產(chǎn)品線不可或缺的一部分。其中一些著名的收購包括:
- WiredTiger 存儲引擎
- mLab 托管服務(wù)
- Realm 移動端數(shù)據(jù)同步方案
- Compass MongoDB GUI 客戶端
盡管 Postgres 和 MongoDB 采取了截然不同的方式來培育生態(tài)系統(tǒng),但都取得了巨大成功。
Postgres or MongoDB?
在某些領(lǐng)域中,明顯一個數(shù)據(jù)庫比另一個更合適:
- 如果你的應(yīng)用程序具有復(fù)雜的業(yè)務(wù)邏輯并且需要復(fù)雜查詢,請選 Postgres。
- 如果你的應(yīng)用程序具有簡單的數(shù)據(jù)模型并需要處理海量數(shù)據(jù),請選 MongoDB。
然而,大多數(shù)應(yīng)用程序用例介于兩者之間,而且兩個數(shù)據(jù)庫都非常強(qiáng)大:
- 作為文檔型數(shù)據(jù)庫,MongoDB 提供了一流的 JSON 支持。而 Postgres 在開源關(guān)系型數(shù)據(jù)庫中也有著最好的 JSON 支持。
- 對于全棧開發(fā)人員來說,MongoDB 曾經(jīng)是首選,因為它與 Node.js 完美集成。而隨著主要第三方應(yīng)用平臺都提供托管 Postgres 服務(wù),Postgres 則變得愈發(fā)有吸引力。
- 對于后端開發(fā)人員來說,在添加事務(wù)支持后,MongoDB 變得更加誘人了。誰不想避免繁瑣的 schema 更改并享受更快速的迭代呢?
- MongoDB Atlas 構(gòu)建了最精細(xì)化的托管數(shù)據(jù)庫服務(wù)之一;而各種大小第三方供應(yīng)商則都提供了出色的 Postgres 托管解決方案。
總體而言,Postgres 是一個更通用的數(shù)據(jù)庫,它采用關(guān)系模型、提供全面 SQL 功能、具備可擴(kuò)展架構(gòu),并由一個熱情洋溢的社區(qū)推動。
MongoDB 是一個全面的數(shù)據(jù)庫解決方案,它普及了文檔模型、內(nèi)置了伸縮性和高可用性,提供了完整的開發(fā)者體驗,并由一個敏銳的營利性商業(yè)實體推動著。
如果在 Postgres 和 MySQL 之間做選擇很困難,那么在 Postgres 和 MongoDB 之間選擇也不容易。而且隨著兩個數(shù)據(jù)庫都朝著更強(qiáng)的方向發(fā)展,選擇只會變得越來越困難。
最后,在一個組織內(nèi)部 Postgres 和 MongoDB 共存也是很常見的情況。如果需要同時管理 Postgres 和 MongoDB 的開發(fā)生命周期,可以來了解一下 Bytebase。
💡 你可以訪問官網(wǎng),免費(fèi)注冊云賬號,立即體驗 Bytebase。