PostgreSQL 的JSON 處理甩「你」幾條街
- 2020 年 3 月 26 日
- 筆記

首先這裡的你絕對不是MONGODB ,至於是誰,你是誰,那的先了解POSTGRESQL 處理 JSON 的方式後,才能確定那個你是誰。
首先POSTGRESQL 支援兩種JSON格式,JSON and JSONB ,在PG 9.X 版本對JSON的支援就已經出具規模了(MONGODB 中的支援BSON格式),拿在postgresql 中大概率的你是要使用JSONB 這樣的格式,這樣的格式有以下一些好處
1 處理的速度快
2 可以添加索引
當然也有一些東西是有限制的,這裡先不表,另外學習的過程,我發現一個點,就是如果你能在學習的過程中,先得到一點甜頭,則你後續的學習就會有興趣,並且很可能越學越快
所以下面我們先做一點實踐,增加興趣
我們建立一個表,如果按照MONGODB 來說,應該叫collection, 然後我們插入一條 document ,格式是jsonb ,但如果你用MONGODB 的方式來理解,你可以找到一點不一樣的地方

可以看到,其實要展示數據在POSTGRESQL 中也並不是難事

然後我們創建一個索引,熟悉PG的人都知道他模糊查詢的厲害,下面的索引的建立也頗有那幾分味道。

explain analyze SELECT * FROM json_test WHERE info @> '{"name": "Calor"}';
查詢中也有一些 JSONB 特殊的查詢的方式,但這樣的查詢方式比初次使用MONGODB 的查詢語句對熟悉SQL 的人要親切的多。


到這裡我們可以小結一下,PostgreSQL 裡面的JSON 可以使用JSONB 的方式來進行存儲,並且大部分時間創建一個GIN 的索引就可以滿足大部分查詢,如果使用過MONGODB 的,可以知道MONGODB 本身存儲是B+樹來存儲索引的,特定的查詢也要配合特定建立的索引,這點上就…….
下面我們繼續做測試,看看是不是POSTGRESQL 可以一個索引就將所有的查詢都HOLD 住。
下面我們創建,一個新的collection
create table test_json_2 (info jsonb);
插入數據
insert into test_json_2 select ('{"name": "nn-' || round(random()*20000000) || '", "ajon": "address", "tags": ["system", "database", "langrage"]}')::jsonb from (select * from generate_series(1,100000)) as temp;

一個10萬行的collection就生成了,照方抓藥,創建索引後,直接查詢,結果很明顯是可以走索引的。

並且網上提及的某些不能走索引的情況,在PG11 這個版本也是可以開始走索引了。

當然如果你統計的數據是全表,或大部分數據,則還是要走全表掃描的

這裡大致的看了一下POSTGRESQL 對JOSN 的支援,相對於某些資料庫還是友好的,並且符合人類快速理解和上手的方式。

當然在面對專業文檔資料庫MONGODB 的強大的處理能力下,沒有其他的資料庫可以抗衡,因為那個是他的 飯碗,如果不是很複雜(就是那種嵌套,嵌套,嵌套,還有數組的讓人頭要炸開的那種)的JSON 或者你沒有專業的MONGODB 的支援,想使用JSON 或文檔的方式在資料庫裡面不想失望的使用,POSTGRESQL 是一個選擇,不錯的。
說到這裡,那個題目中的「你」到底應該頒給誰?心裡早就有答案了吧
