最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

?PostgreSQL?與MongoDB使用對比分析

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

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

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

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

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

PostgreSQL 對 JSON 的支持

我們來了解一下 PostgreSQL 支持 JSON 特性的時間線(統(tǒng)計到版本 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,提供了強大而靈活的 JSON 處理能力。

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

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

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

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

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

PostgreSQL 和 MongoDB 使用對比

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

我們將 MongoDB 的 _id 單獨存為一個字段,其它字段存為 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)計數(shù)據(jù),將固定的列抽成一個單獨的列往往能獲得更好的查詢性能。

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 中的部分索引進行了性能對比。

3. sharding

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

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

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

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

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

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

MongoDBCitus
數(shù)據(jù)存儲節(jié)點shardworker
元數(shù)據(jù)存儲節(jié)點config servercoordinator
請求接入節(jié)點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,但實際并不支持)。

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ū)非常活躍,相信未來他們會將這些特性逐漸完善。

總結(jié)

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

雖然 Michael Stonebraker 早在 2005 年就指出 One size fits all[9] 是一個不切實際的觀點,但數(shù)據(jù)庫開發(fā)者從未停止探索的腳步,期望為用戶提供一站式的解決方案。MongoDB 從最初的 NoSQL[10] 到后來支持了事務(wù)[11]、時序[12]等特性,PostgreSQL 生態(tài)也有時序(TimescaleDB[13])、圖(AGE[14])、消息隊列(PGMQ[15])相關(guān)的擴展。雖然在功能特性上有所重合,但不同的是,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使用心得簡單總結(jié)

    mongodb使用心得簡單總結(jié)

    本文整理了一年多以來我常用的MongoDB操作,既有運維層面也有應(yīng)用層面,內(nèi)容有淺有深,這也就是我從零到熟練的歷程。
    2016-01-01
  • python實現(xiàn)爬蟲數(shù)據(jù)存到 MongoDB

    python實現(xiàn)爬蟲數(shù)據(jù)存到 MongoDB

    本文給大家分享的是使用python實現(xiàn)將爬蟲爬到的數(shù)據(jù)存儲到mongoDB數(shù)據(jù)庫中的實例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • MongoDB用Mongoose得到的對象不能增加屬性完美解決方法(兩種)

    MongoDB用Mongoose得到的對象不能增加屬性完美解決方法(兩種)

    本文給大家分享兩種解決方案解決MongoDB用Mongoose得到的對象不能增加屬性問題,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2017-11-11
  • MongoDB數(shù)據(jù)庫去重函數(shù)Distinct用法實例

    MongoDB數(shù)據(jù)庫去重函數(shù)Distinct用法實例

    在MongoDB中可以使用distinct()方法對變量進行去重操作,distinct()方法是用于返回指定字段的唯一值的操作,這篇文章主要給大家介紹了關(guān)于MongoDB數(shù)據(jù)庫去重函數(shù)Distinct用法的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • MongoDB 內(nèi)存管理相關(guān)總結(jié)

    MongoDB 內(nèi)存管理相關(guān)總結(jié)

    這篇文章主要介紹了MongoDB 內(nèi)存管理的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MongoDB數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-03-03
  • MongoDB 常用的數(shù)據(jù)類型和基本操作

    MongoDB 常用的數(shù)據(jù)類型和基本操作

    這篇文章主要介紹了MongoDB 常用的數(shù)據(jù)類型和基本操作,幫助大家更好的理解和學(xué)習(xí)使用MongoDB數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-03-03
  • Mongodb副本集和分片示例詳解

    Mongodb副本集和分片示例詳解

    這篇文章主要給大家介紹了關(guān)于Mongodb副本集和分片的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Mongodb具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳解MongoDB數(shù)據(jù)還原及同步解決思路

    詳解MongoDB數(shù)據(jù)還原及同步解決思路

    mongodb數(shù)據(jù)如何還原,同步到其他系統(tǒng)?其實實現(xiàn)方法很簡單,這篇文章主要介紹了MongoDB數(shù)據(jù)還原及同步解決思路,需要的朋友可以參考下
    2018-08-08
  • MongoDB 常用的crud操作語句

    MongoDB 常用的crud操作語句

    本篇介紹了 MongoDB 的基本 CRUD 操作,可以看到 MongoDB 的語法極其簡潔,而且可以使用鏈式調(diào)用的方式進行操作。操作的參數(shù)也很固定,且方法名稱很明確,上手來說是很容易的
    2021-06-06
  • 在MongoDB中實現(xiàn)時間范圍查詢的代碼詳解

    在MongoDB中實現(xiàn)時間范圍查詢的代碼詳解

    MongoDB作為一個高性能、開源、無模式的文檔型數(shù)據(jù)庫,廣泛應(yīng)用于各種需要靈活數(shù)據(jù)模型的應(yīng)用場景中,在處理與時間相關(guān)的數(shù)據(jù)時,MongoDB提供了強大的查詢能力,本文將詳細介紹如何在MongoDB中執(zhí)行時間范圍查詢,需要的朋友可以參考下
    2024-08-08

最新評論

鄄城县| 朔州市| 镇远县| 东山县| 铜川市| 灵山县| 临泽县| 绥德县| 寿宁县| 剑阁县| 杭州市| 梅州市| 会宁县| 长沙县| 潞西市| 包头市| 泰宁县| 康马县| 衡水市| 义乌市| 麦盖提县| 林州市| 隆回县| 金门县| 东港市| 石河子市| 盖州市| 榆中县| 陇南市| 渭南市| 锦屏县| 齐齐哈尔市| 商洛市| 中宁县| 商水县| 托克托县| 承德市| 雷山县| 福州市| 边坝县| 安陆市|