93 / 100

JSON

JSON va JSONB ma'lumot turlari

Ushbu qo'llanmada PostgreSQLda yarim-strukturalangan ma'lumotlarni saqlash va boshqarish uchun JSON hamda JSONB ma'lumot turlaridan qanday foydalanishni o'rganasiz.

JSON haqida umumiy tushuncha

JSON (JavaScript Object Notation) — bu dasturlar o'rtasida ma'lumot almashish uchun keng qo'llaniladigan yengil, odam o'qiy oladigan formatdir.

JSON ikkita asosiy strukturaga tayanadi:

  1. Obyektlar ({}): Kalit-qiymat juftliklari to'plami (masalan, {"brand": "Apple", "price": 999}).
  2. Massivlar ([]): Tartiblangan qiymatlar ro'yxati (masalan, ["5G", "OLED", "128GB"]).

PostgreSQLdagi JSON va JSONB turlarining farqi

PostgreSQL JSON ma'lumotlarini saqlash uchun ikkita tur taqdim etadi:

XususiyatJSONJSONB (Tavsiya etiladi)
Saqlash formatiMatn ko'rinishida (asliga mos)Dekompilyatsiya qilingan binar formatda
Saqlash hajmiKatta (probellar va qatorlar saqlanadi)Ixcham
Kiritish tezligiTezroq (hech qanday qayta ishlashsiz)Bir oz ko'proq tahlil (parse) talab qiladi
Qidiruv tezligiSekin (har safar matndan qayta tahlil qilinadi)Juda tez
IndekslashCheklanganGIN indekslarini to'liq qo'llab-quvvatlaydi
Kalitlar tartibiKiritilgan tartibda qoladiTartib saqlanmaydi
Takroriy kalitlarRuxsat beradi (oxirgisi olinadi)Ruxsat bermaydi (faqat bittasi qoladi)

[!TIP] Deyarli barcha amaliy vazifalarda tezkor qidiruv va GIN indekslarini qo'llash uchun JSONB turidan foydalanish tavsiya etiladi.

Namunaviy jadval va ma'lumot kiritish

Smartfonlar haqida ma'lumot saqlovchi jadval tuzamiz:

query.sql
DROP TABLE IF EXISTS phones CASCADE;

CREATE TABLE phones (
  id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  properties JSONB
);

INSERT INTO phones (name, properties) VALUES
('iPhone 16 Pro', 
 '{
    "display": "6.1-inch OLED",
    "features": ["Face ID", "ProMotion 120Hz", "MagSafe", "iOS 18"]
 }'),

('Galaxy S23 Ultra', 
 '{
    "display": "6.8-inch AMOLED",
    "features": ["S Pen", "120Hz Display", "One UI 5", "Wireless Charging"]
 }'),

('Pixel 7 Pro', 
 '{
    "display": "6.7-inch OLED",
    "features": ["Magic Eraser", "Pure Android Experience", "Face Unlock", "5G Connectivity"]
 }');

JSON ma'lumotlarini ajratib olish (-> va ->>)

PostgreSQL JSON obyektlari va massivlaridan qiymat olish uchun maxsus operatorlarni taqdim etadi:

  • -> operatori — qiymatni JSON yoki JSONB formatida qaytaradi (qo'shtirnoqlar bilan).
  • ->> operatori — qiymatni toza matn (TEXT) ko'rinishida qaytaradi (qo'shtirnoqsiz).

1) Kalit bo'yicha qiymat olish:

query.sql
SELECT
  name,
  properties -> 'display' AS display_json,
  properties ->> 'display' AS display_text
FROM
  phones;

Natija:

matn
       name       |   display_json    |  display_text   
------------------+-------------------+-----------------
 iPhone 16 Pro    | "6.1-inch OLED"   | 6.1-inch OLED
 Galaxy S23 Ultra | "6.8-inch AMOLED" | 6.8-inch AMOLED
 Pixel 7 Pro      | "6.7-inch OLED"   | 6.7-inch OLED

2) JSON massividan indeks bo'yicha element olish:

JSON massivlarida indekslash 0 dan boshlanadi:

query.sql
SELECT
  name,
  properties -> 'features' ->> 0 AS first_feature
FROM
  phones;

Natija:

matn
       name       | first_feature 
------------------+---------------
 iPhone 16 Pro    | Face ID
 Galaxy S23 Ultra | S Pen
 Pixel 7 Pro      | Magic Eraser

JSONB bo'yicha qidiruv va filtrlash

O'z ichiga olish operatori (@>)

Aytaylik, xususiyatlari orasida "Face ID" bo'lgan telefonlarni topmoqchimiz:

query.sql
SELECT name, properties
FROM phones
WHERE properties @> '{"features": ["Face ID"]}';

Natija:

matn
     name      |                                           properties                                            
---------------+-------------------------------------------------------------------------------------------------
 iPhone 16 Pro | {"display": "6.1-inch OLED", "features": ["Face ID", "ProMotion 120Hz", "MagSafe", "iOS 18"]}

JSONB ustunlarini indekslash (GIN Index)

JSONB hujjatlari ichidagi kalitlar va qiymatlar bo'yicha tezkor qidiruvni amalga oshirish uchun GIN indeksidan foydalaniladi:

query.sql
CREATE INDEX idx_phones_properties ON phones USING GIN (properties);

Ushbu indeks @>, ?, ?|, ?& kabi JSONB qidiruv operatorlarini chaqmoqdek tezlashtiradi.

Xulosa

  • PostgreSQL JSON (matn) va JSONB (binar) ma'lumot turlarini qo'llab-quvvatlaydi.
  • Yuqori unumdorlik va qidiruv uchun JSONB dan foydalanish afzalroqdir.
  • -> JSON obyekt/massiv qaytaradi, ->> esa oddiy TEXT qaytaradi.
  • JSON massivlari indekslanishi 0 dan boshlanadi.
  • JSONB ustunlari bo'yicha so'rovlarni optimallashtirish uchun GIN indekslari qo'llanadi.