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 (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:
{}): Kalit-qiymat juftliklari to'plami (masalan, {"brand": "Apple", "price": 999}).[]): Tartiblangan qiymatlar ro'yxati (masalan, ["5G", "OLED", "128GB"]).PostgreSQL JSON ma'lumotlarini saqlash uchun ikkita tur taqdim etadi:
| Xususiyat | JSON | JSONB (Tavsiya etiladi) |
|---|---|---|
| Saqlash formati | Matn ko'rinishida (asliga mos) | Dekompilyatsiya qilingan binar formatda |
| Saqlash hajmi | Katta (probellar va qatorlar saqlanadi) | Ixcham |
| Kiritish tezligi | Tezroq (hech qanday qayta ishlashsiz) | Bir oz ko'proq tahlil (parse) talab qiladi |
| Qidiruv tezligi | Sekin (har safar matndan qayta tahlil qilinadi) | Juda tez |
| Indekslash | Cheklangan | GIN indekslarini to'liq qo'llab-quvvatlaydi |
| Kalitlar tartibi | Kiritilgan tartibda qoladi | Tartib saqlanmaydi |
| Takroriy kalitlar | Ruxsat 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.
Smartfonlar haqida ma'lumot saqlovchi jadval tuzamiz:
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"]
}');
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).SELECT
name,
properties -> 'display' AS display_json,
properties ->> 'display' AS display_text
FROM
phones;
Natija:
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
JSON massivlarida indekslash 0 dan boshlanadi:
SELECT
name,
properties -> 'features' ->> 0 AS first_feature
FROM
phones;
Natija:
name | first_feature
------------------+---------------
iPhone 16 Pro | Face ID
Galaxy S23 Ultra | S Pen
Pixel 7 Pro | Magic Eraser
@>)Aytaylik, xususiyatlari orasida "Face ID" bo'lgan telefonlarni topmoqchimiz:
SELECT name, properties
FROM phones
WHERE properties @> '{"features": ["Face ID"]}';
Natija:
name | properties
---------------+-------------------------------------------------------------------------------------------------
iPhone 16 Pro | {"display": "6.1-inch OLED", "features": ["Face ID", "ProMotion 120Hz", "MagSafe", "iOS 18"]}
JSONB hujjatlari ichidagi kalitlar va qiymatlar bo'yicha tezkor qidiruvni amalga oshirish uchun GIN indeksidan foydalaniladi:
CREATE INDEX idx_phones_properties ON phones USING GIN (properties);
Ushbu indeks @>, ?, ?|, ?& kabi JSONB qidiruv operatorlarini chaqmoqdek tezlashtiradi.
JSON (matn) va JSONB (binar) ma'lumot turlarini qo'llab-quvvatlaydi.-> JSON obyekt/massiv qaytaradi, ->> esa oddiy TEXT qaytaradi.0 dan boshlanadi.