欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

?PostgreSQL?與MongoDB使用對比分析

 更新時間:2023年12月06日 14:21:33   作者:小小哭包  
這篇文章主要介紹了為什么?PostgreSQL?能代替?MongoDB?,需要的朋友可以參考下

在進(jìn)行技術(shù)選型時,需要考慮眾多因素,如功能、性能、可靠性、成本效益、社區(qū)支持和團(tuán)隊(duì)技術(shù)能力等,然而,影響最終決定的關(guān)鍵因素的往往是團(tuán)隊(duì) Leader 的技術(shù)品味,這也能解釋為什么阿里偏愛 Java,而字節(jié)跳動更傾向 Go、Rust 等新興語言。技術(shù)本身無好壞之分,根據(jù)實(shí)際業(yè)務(wù)問題選擇適當(dāng)?shù)募夹g(shù)方案是關(guān)鍵。

本文旨在為讀者提供一種新的選擇,而非論證 PostgreSQL 比 MongoDB 更優(yōu)秀。

MongoDB 因其靈活的 "Schema-less"(無模式)特性而著名。"Schema-less" 意味著 MongoDB 不要求嚴(yán)格定義數(shù)據(jù)的結(jié)構(gòu)和字段(使用 BSON 格式存儲數(shù)據(jù)),允許在同一集合中存儲具有不同結(jié)構(gòu)的文檔,這為開發(fā)人員提供了極大的靈活性,能夠輕松適應(yīng)數(shù)據(jù)模型的變化和演進(jìn)。

PostgreSQL 提供的 JSONB 類型可用于存儲和處理 JSON 數(shù)據(jù),包括嵌套的對象、數(shù)組和基本數(shù)據(jù)類型。因此,PostgreSQL 具備 MongoDB 存儲 document 的能力。

PostgreSQL 對 JSON 的支持

我們來了解一下 PostgreSQL 支持 JSON 特性的時間線(統(tǒng)計(jì)到版本 14):

- PG 9.2 Introduction of JSON (JSON text; no indexes) -- 2012/9/10
- PG 9.4 Introduction of JSONB (binary format; indexes) -- 2014/12/18
- PG 9.5 jsonb_set(), jsonb_object(), jsonb_build_object(), jsonb_build_array, jsonb_agg, || operator etc.
- PG 9.6 jsonb_insert()
- PG 10 Full text search support for JSONB
- PG 11 jsonb_plpython
- PG 12 json_path (like xpath in XML; part of SQL Standard 2016)
- PG 13 jsonpath.datetime()
- PG 14 JSONB subscripting can be used to extract and assign to portions of JSONB

可以看出,PostgreSQL 對 JSON 的支持雖晚于 MongoDB(MongoDB 1.0 在 2009年9月前后發(fā)布),但其后續(xù)的版本 JSON 相關(guān)的特性開發(fā)非?;钴S,提供了強(qiáng)大而靈活的 JSON 處理能力。

PostgreSQL提供兩種存儲 JSON[1] 的數(shù)據(jù)類型:json 和 jsonb,二者接受幾乎相同的輸入值,主要區(qū)別在存取效率。json 存儲插入文本的精確副本,處理函數(shù)在每次執(zhí)行時必須重新解析;jsonb 則存儲解析過的的二進(jìn)制格式(類似 MongoDB 的 BSON),由于需要額外的轉(zhuǎn)換開銷,插入時稍慢一些,但因?yàn)闊o需重新解析,處理速度更勝一籌。另外 jsonb 還支持索引,這是一個重要的優(yōu)勢。

大多數(shù)場景我們都應(yīng)該使用 jsonb,除非以下幾種情況:

• 需要保留原始輸入的格式,比如空格

• 需要保留鍵的順序或冗余的鍵值

• 需要快速插入和讀取而無需對數(shù)據(jù)進(jìn)行處理

PostgreSQL 和 MongoDB 使用對比

在了解了 PostgreSQL 的 JSON 特性之后,我們來對比一下 PostgreSQL 和 MongoDB 使用上的區(qū)別。

我們將 MongoDB 的 _id 單獨(dú)存為一個字段,其它字段存為 doc:

create table inventory(_id bigserial PRIMARY KEY , doc jsonb);

1. CRUD

MongoDB:

db.inventory.insertOne(
   { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
db.inventory.insertMany([
   { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
   { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
   { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
db.inventory.find( { tags: ["red", "blank"] } )
db.inventory.find( { qty: { $gt: 25 } } )
db.inventory.find( { "tags": { $size: 2 } } )
db.inventory.find( { 'size.h': { $lte: 20 } } )
db.inventory.updateOne( { _id: 3 }, [ { $set: { "item": "notepad"} } ] )
db.inventory.deleteOne( { qty: { $gt: 90 } } )

PG:

insert into inventory(doc) values('{ "item": "canvas", "qty": 100, "tags": ["cotton"], "size": { "h": 28, "w": 35.5, "uom": "cm" } }');
insert into inventory(doc) values('{ "item": "journal", "qty": 25, "tags": ["blank", "red"], "size": { "h": 14, "w": 21, "uom": "cm" } }'),
                                  ('{ "item": "mat", "qty": 85, "tags": ["gray"], "size": { "h": 27.9, "w": 35.5, "uom": "cm" } }'),
                                  ('{ "item": "mousepad", "qty": 25, "tags": ["gel", "blue"], "size": { "h": 19, "w": 22.85, "uom": "cm" } }');
SELECT * FROM inventory WHERE doc->'tags' @> '["red", "blank"]'::jsonb;
SELECT * FROM inventory WHERE (doc->>'qty')::integer > 25;
SELECT * FROM inventory WHERE jsonb_array_length(doc->'tags') = 2;
SELECT * FROM inventory WHERE (doc->'size'->>'h')::float <= 20;
UPDATE inventory SET doc = jsonb_set(doc, '{item}', '"notepad"', true) WHERE _id = 3;
DELETE FROM inventory WHERE (doc->>'qty')::integer > 90 AND ctid IN (SELECT ctid FROM inventory LIMIT 1);

注意: 將全部數(shù)據(jù)存儲在 PostgreSQL 的一個 jsonb 字段雖然可行,但 jsonb 沒有狀態(tài)統(tǒng)計(jì)數(shù)據(jù),將固定的列抽成一個單獨(dú)的列往往能獲得更好的查詢性能。

2. 索引

MongoDB 支持的索引在 PostgreSQL 中基本都支持,雖然通配符索引在 PostgreSQL 沒看到類似的能力,但 PostgreSQL 的索引能力應(yīng)該不遜于 MongoDB。

MongoDBPostgreSQL
Single Field indexesB-tree Index
Compound IndexesMulticolumn Indexes
Text IndexesGIN Indexes + tsvector
Wildcard Indexes?
Geospatial IndexesPostgis geometry GiST Indexes
Hashed IndexesHash Indexes
?BRIN Indexes

Can PostgreSQL with its JSONB column type replace MongoDB?[2] ???? 這篇文章對 MongoDB 和 PostgreSQL 中的部分索引進(jìn)行了性能對比。

3. sharding

MongoDB 使用 sharding(分片)來支持超大數(shù)據(jù)集和高吞吐量的集群部署,通過將數(shù)據(jù)集水平拆分為多個分片,并將每個分片分布在不同的服務(wù)器上。每個服務(wù)器(或分片)都可以獨(dú)立處理一部分?jǐn)?shù)據(jù)寫入和查詢負(fù)載,從而提高整個系統(tǒng)的擴(kuò)展性和性能。其架構(gòu)如下:

• shard: 每個 shard 可以部署為一個副本集(replica set),單個 shard 上包含多個分片

• mongos: 接收客戶端的請求,并將請求路由到 shard

• config servers: 存儲集群元數(shù)據(jù)和配置信息

MongoDB 在 collection 級別進(jìn)行數(shù)據(jù)切分,使用 shard key(由文檔中的一個或多個字段組成) 將 collection 切分為多個 chunks分布在集群中的各個分片上。

PostgreSQL 本身不支持分布式,但 Citus[3] 提供了 sharding 的能力,其組件幾乎都能跟 MongoDB 對應(yīng)上:

MongoDBCitus
數(shù)據(jù)存儲節(jié)點(diǎn)shardworker
元數(shù)據(jù)存儲節(jié)點(diǎn)config servercoordinator
請求接入節(jié)點(diǎn)mongoscoordinator
數(shù)據(jù)分布方法Hashed + RangedHash
分區(qū)級別collection levelschema level + table level
分片名稱chunkshard

PostgreSQL + Citus 能夠?qū)崿F(xiàn) MongoDB 分片的能力。不過 Citus 不支持使用多字段作為 shard key,且只支持 Hash 分布(代碼倉庫中有 RANGE_DISTRIBUTED,但實(shí)際并不支持)。

FerretDB

說到替換 MongoDB,不得不提一下 FerretDB[4],F(xiàn)erretDB 的目標(biāo)是允許使用現(xiàn)有的關(guān)系型數(shù)據(jù)庫來處理 MongoDB 的查詢請求,它充當(dāng)一個代理,接收來自應(yīng)用程序的 MongoDB 查詢,并將其轉(zhuǎn)換為相應(yīng)的 SQL 查詢,然后將結(jié)果返回給應(yīng)用程序。FerretDB 支持使用 PostgreSQL 或 SQLite 等關(guān)系型數(shù)據(jù)庫作為后端存儲引擎,其架構(gòu)如下:

FerretDB 能夠處理 MongoDB 大部分請求,但目前有些能力還不具備,如:

• $lookup aggregation pipeline[5]

• geospatial index[6]

• text indexes[7]

• sharding[8]

• ...

不過 FerretDB 的社區(qū)非?;钴S,相信未來他們會將這些特性逐漸完善。

總結(jié)

相比 MongoDB 的 "Schema-less",PostgreSQL 確實(shí)需要事先定義好表結(jié)構(gòu),包括列名、數(shù)據(jù)類型和約束等,但 PostgreSQL 的 JSONB 類型提供了一種在關(guān)系型數(shù)據(jù)庫中存儲和查詢 JSON 數(shù)據(jù)的靈活性。也正是這種表結(jié)構(gòu)和 JSONB 類型相結(jié)合的能力,使得筆者認(rèn)為 PostgreSQL 比 MongoDB 單純的 "Schema-less" 更靈活、更強(qiáng)大。

雖然 Michael Stonebraker 早在 2005 年就指出 One size fits all[9] 是一個不切實(shí)際的觀點(diǎn),但數(shù)據(jù)庫開發(fā)者從未停止探索的腳步,期望為用戶提供一站式的解決方案。MongoDB 從最初的 NoSQL[10] 到后來支持了事務(wù)[11]、時序[12]等特性,PostgreSQL 生態(tài)也有時序(TimescaleDB[13])、圖(AGE[14])、消息隊(duì)列(PGMQ[15])相關(guān)的擴(kuò)展。雖然在功能特性上有所重合,但不同的是,MongoDB 作為一個商業(yè)公司,其產(chǎn)品在易用性上會更勝一籌,而 PostgreSQL 則需要使用者不斷去探索來發(fā)掘其無限可能。

最后,Michael Stonebraker 三篇關(guān)于 NoSQL 的博客:

• "Schema Later" Considered Harmful[16]: If you have data that will require a schema at some point, you are way better off doing the work up front to avoid data debt, because the cost of schema later is a lot higher.

• Comparison of JOINS: MongoDB vs. PostgreSQL[17]

• Those Who Forget the Past Are Doomed to Repeat It[18]

到此這篇關(guān)于為什么 PostgreSQL 能代替 MongoDB?的文章就介紹到這了,更多相關(guān)PostgreSQL 能代替 MongoDB內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mongodb本地連接失敗的問題解決

    mongodb本地連接失敗的問題解決

    本文主要介紹了mongodb本地連接失敗的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • MongoDB與MySQL的操作對比表及區(qū)別介紹

    MongoDB與MySQL的操作對比表及區(qū)別介紹

    這篇文章主要介紹了MongoDB與MySQL的操作對比表及區(qū)別介紹,本文著重講解了Mongodb與Mysql的操作命令的對比,需要的朋友可以參考下
    2015-05-05
  • MongoDB執(zhí)行mongoexport時的異常及分析(數(shù)字類型的查詢)

    MongoDB執(zhí)行mongoexport時的異常及分析(數(shù)字類型的查詢)

    這篇文章主要給大家介紹了關(guān)于MongoDB執(zhí)行mongoexport時的異常及分析(數(shù)字類型的查詢)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • MongoDB插入數(shù)據(jù)的3種方法

    MongoDB插入數(shù)據(jù)的3種方法

    在MongoDB中,db.collection.insert()方法添加一個新文檔到集合中。另外,db.collection.update()方法和db.collection.save()方法也能通過upsert操作添加新文檔。upsert操作執(zhí)行更新現(xiàn)有文檔或者當(dāng)文檔不存在時插入一個新文檔。
    2014-05-05
  • MongoDB 用戶相關(guān)操作

    MongoDB 用戶相關(guān)操作

    這篇文章主要介紹了MongoDB 用戶相關(guān)操作,幫助大家更好的理解和學(xué)習(xí)使用MongoDB數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-03-03
  • 一文搞懂Scrapy與MongoDB交互過程

    一文搞懂Scrapy與MongoDB交互過程

    這篇文章主要介紹了Scrapy與MongoDB交互過程,文末給大家介紹了類方法@classmethod的相關(guān)知識,需要的朋友可以參考下
    2022-07-07
  • MongoDB中方法limit和skip的使用

    MongoDB中方法limit和skip的使用

    這篇文章主要給大家介紹了關(guān)于MongoDB中方法limit和skip的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • MongoDB為什么比Mysql快原理解析

    MongoDB為什么比Mysql快原理解析

    這篇文章主要為大家介紹了MongoDB為什么比Mysql快原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • MongoDB入門教程(包含安裝、常用命令、相關(guān)概念、使用技巧、常見操作等)

    MongoDB入門教程(包含安裝、常用命令、相關(guān)概念、使用技巧、常見操作等)

    這篇文章主要介紹了MongoDB入門教程,包含安裝、常用命令、相關(guān)概念、使用技巧、常見操作等,是一篇比較好的入門文章,需要的朋友可以參考下
    2014-06-06
  • 如何通過MongoDB?Atlas?實(shí)現(xiàn)語義搜索與?RAG(邁向AI的搜索機(jī)制)

    如何通過MongoDB?Atlas?實(shí)現(xiàn)語義搜索與?RAG(邁向AI的搜索機(jī)制)

    MongoDBAtlas的語義搜索功能通過向量化存儲和檢索非結(jié)構(gòu)化數(shù)據(jù),結(jié)合RAG框架,實(shí)現(xiàn)了高效的知識檢索和增強(qiáng)型生成應(yīng)用,本文給大家介紹如何通過MongoDB?Atlas?實(shí)現(xiàn)語義搜索與?RAG(邁向AI的搜索機(jī)制),感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評論