繁體中文(台灣)
  • postgresql
  • jsonb
  • json
  • database

掌握 PostgreSQL JSONB 類型的一篇文章

學習如何使用 PostgreSQL 的 JSONB 類型來高效地儲存、查詢和操作 JSON 資料。

Yijun
Yijun
Developer

在現代應用程式開發中,處理和儲存非結構化資料變得越來越常見。PostgreSQL 的 JSONB 類型為開發人員提供了一個強大的工具,能高效地儲存和查詢 JSON 資料。在本文中,我們將深入探討 JSONB 類型的概念和使用,並通過具體的程式碼範例展示其強大的功能。

什麼是 JSONB?

JSONB 是一種類型的 PostgreSQL 資料類型,以二進制格式儲存 JSON 資料。與普通 JSON 類型不同,JSONB 在查詢和操作上更高效。它支持的一套豐富的運算符和函數簡化了 JSON 資料處理。此外,JSONB 支援多種索引類型,包括 B-tree、Hash、GIN 和 GiST 索引,進一步提升了查詢性能。

創建 JSONB 類型

創建帶有 JSONB 類型的表格

首先,讓我們創建一個帶有 JSONB 列的表格。假設我們有一個 products 表來儲存產品資訊,產品詳情使用 JSONB 類型來儲存。

插入 JSONB 資料

我們可以使用簡單的 INSERT 語句將 JSON 資料插入到 JSONB 欄位中。

查詢 JSONB 資料

從 JSONB 欄位中提取值

我們可以使用 ->> 運算符從 JSONB 欄位中提取文字值。下面的例子展示了如何提取產品的品牌資訊。

使用 JSONB 提取嵌套值

我們可以結合使用 ->->> 運算符來提取嵌套在 JSON 結構中的值。下面的例子展示了如何提取產品的 CPU 資訊。

使用 JSONB 路徑提取值

使用 #>> 運算符,我們可以從 JSON 資料中的特定位路徑提取值。下面的例子展示了如何提取儲存資訊。

使用 @> 運算符進行包含查詢

@> 運算符檢查 JSONB 對像是否包含另一個 JSONB 對像。下面的例子展示了如何查詢特定品牌的產品。

修改 JSONB 資料

更新 JSONB 資料

我們可以使用 jsonb_set 函數來更新 JSONB 資料。該函數更新指定路徑的值。下面的例子展示了如何更新產品的儲存資訊。

刪除 JSONB 資料中的頂層字段

我們可以使用 - 運算符從 JSONB 資料中刪除頂層字段。該運算符從 JSONB 對像中刪除指定的鍵。下面的例子展示了如何從產品詳細資訊中刪除頂層字段。

刪除 JSONB 資料中的嵌套字段

我們可以使用 #- 運算符從 JSONB 資料中特定位路徑刪除元素。該運算符刪除指定路徑上的鍵。下面的例子展示了如何刪除產品規格中的 CPU 資訊。

高級 JSONB 查詢

使用 JSONB 陣列

JSONB 資料可以包括陣列,我們可以使用和陣列相關的運算符來處理這類資料。下面的例子展示了如何儲存和查詢具有多個標籤的產品。

在上述例子中,你也可以使用 ? 運算符檢查 JSONB 陣列是否包含特定元素:

合併 JSONB 資料

我們可以使用 || 運算符合併兩個 JSONB 對象。該運算符將兩個 JSONB 對象合為一個。下面的例子展示了如何將新規格合併到現有的產品詳情中。

聚合 JSONB 資料

我們可以使用聚合函數來處理 JSONB 資料,例如計算每個品牌的產品數量。

JSONB 索引和性能優化

為了提高 JSONB 資料的查詢性能,我們可以在 JSONB 欄位中的特定鍵上創建索引。為不同查詢需要選擇正確的索引類型至關重要。

  • GIN 索引:適合處理多值資料、陣列和全文檢索的複雜查詢。
  • B-tree 索引:適合簡單的鍵值對查詢、範圍查詢和排序操作。

適當選擇和創建索引可以顯著提升 JSONB 資料查詢的性能。

創建 GIN 索引

GIN 索引非常適合加速涉及多值資料和陣列的查詢。例如,我們可以為之前提到的 tags 陣列創建 GIN 索引,以加速對陣列元素的查詢。

創建 B-tree 索引

對於簡單的鍵值對查詢,B-tree 索引也可以顯著提高性能。B-tree 索引適用於範圍查詢和排序操作。下面的例子展示了如何為 details 中的 model 鍵創建 B-tree 索引。

結論

PostgreSQL 的 JSONB 類型為處理 JSON 資料提供了一種強大而靈活的解決方案。透過本文中的介紹和範例,你現在應該對如何使用 JSONB 類型有了全面的理解。掌握這些技術,能夠高效處理和查詢非結構化資料,提升你的應用程式的性能和靈活性。