PostgreSQL-də bir çox developer tez-tez belə bir seçim qarşısında qalır: məlumatı saxlamaq üçün hansı data strukturundan istifadə edim? Daha sadə data strukturu üçün array-lərdən (ARRAY) istifadə edim? Yoxsa sadəcə mətn (TEXT) sütunları ilə işləyim? Bəlkə də, "açar-dəyər" cütlərini saxlamaq üçün HSTORE daha uyğundur? Və əlbəttə, əsas sual: bəs nə vaxt JSON və ya JSONB daha yaxşıdır?
Bunu aydınlaşdırmaq üçün, hər yanaşmanın üstünlükləri və çatışmazlıqları barədə danışacağıq və istifadə nümunələri göstərəcəyik.
Array-lər (ARRAY) nə vaxt, JSONB nə vaxt istifadə olunmalıdır?
Array-lər (ARRAY) eyni tipli dəyərlərdən ibarət olan məlumatlar üçün əladır. Məsələn, tələbələrin qiymət siyahısı və ya bir qeyd üçün tag-lar varsa, array-lər super işləyir.
Array nümunəsi:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT,
grades INTEGER[] -- qiymətlərin array-i
);
INSERT INTO students (name, grades)
VALUES ('Alice', ARRAY[90, 85, 88]),
('Bob', ARRAY[70, 75, 78]);
Digər tərəfdən, JSONB daha mürəkkəb, nested strukturlar üçün uyğundur. Hər qeyd üçün əlavə məlumat saxlamaq istəyirsinizsə, məsələn, hər qiymət üçün təsvir, JSONB daha yaxşıdır.
JSONB nümunəsi:
CREATE TABLE students_json (
id SERIAL PRIMARY KEY,
name TEXT,
grades JSONB -- qiymətlər haqqında obyekt
);
INSERT INTO students_json (name, grades)
VALUES ('Alice', '{"Math": 90, "Science": 85, "English": 88}'),
('Bob', '{"Math": 70, "Science": 75, "English": 78}');
Əsas fərqlər
| Kriteriya | Array-lər (ARRAY) |
JSONB |
|---|---|---|
| Struktur | Eyni tipli homogen data | Mürəkkəb nested data strukturları |
| Məlumata çıxış | İndeks ilə: grades[1] |
Açar ilə: grades->'Math' |
| İndeks dəstəyi | Yalnız GIN və ya BTREE bütün array üçün |
Rahat GIN və BTREE indekslər açarlara görə |
| Nə vaxt istifadə etməli | Sadə data siyahıları (tag-lar, qiymətlər, id-lər) | Açar və dəyərlərlə mürəkkəb obyektlər |
Array-dan JSONB-yə və əksinə çevirmə nümunələri
Gəlin baxaq, məlumatı array və JSONB arasında necə çevirmək olar:
Array → JSONB
SELECT to_jsonb(grades) AS grades_jsonb
FROM students;
-- Nəticə:
-- [{"90","85","88"}]
JSONB → Array
SELECT array_agg(value::INTEGER) AS grades_array
FROM jsonb_array_elements_text('["90", "85", "88"]');
-- Nəticə:
-- {90,85,88}
JSONB və mətn məlumatları (TEXT) müqayisəsi
Mətn sütunları, sadəcə mətn və ya kiçik struktursuz məlumat saxlamaq üçün idealdır. Tapşırığınız sadəcə string-lərdə uyğunluq axtarışıdırsa, məsələn, məhsulun adı və ya təsviri, TEXT sizin üçün ən yaxşı seçimdir.
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title TEXT,
description TEXT
);
INSERT INTO books (title, description)
VALUES ('SQL Basics', 'SQL-ə qısa giriş'),
('Advanced PostgreSQL', 'PostgreSQL performansı üçün dərin bələdçi');
JSONB nə vaxt daha yaxşıdır?
Əgər mətniniz artıq nested struktura çevrilirsə (məsələn, təsvirin içində kateqoriya və tag-lar siyahısı varsa), JSONB seçmək daha yaxşıdır.
CREATE TABLE books_json (
id SERIAL PRIMARY KEY,
info JSONB
);
INSERT INTO books_json (info)
VALUES ('{"title": "SQL Basics", "tags": ["beginner", "database"]}'),
('{"title": "Advanced PostgreSQL", "tags": ["performance", "optimization"]}');
Əsas fərqlər
| Kriteriya | Mətn (TEXT) |
JSONB |
|---|---|---|
| Struktur | Struktursuz data | Strukturlaşdırılmış, nested data |
| Axtarış | Full-text search | Açar, dəyər və nested struktura görə axtarış |
| Məlumatı dəyişmək | Yalnız tam əvəzləmə | Fərdi açarları dəyişmək |
| Nə vaxt istifadə etməli | Sadə mətn sətirləri | Açar-dəyər formatında mürəkkəb data |
JSONB və HSTORE müqayisəsi
HSTORE — JSONB-nin böyük qardaşıdır, "açar-dəyər" cütlərini saxlamağa imkan verir. Əgər data strukturunuz sadədirsə (nested və array-lərə ehtiyac yoxdursa), HSTORE daha yüngül və sürətlidir.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
attributes HSTORE
);
INSERT INTO products (attributes)
VALUES ('"rəng"=>"qırmızı", "ölçü"=>"M"'),
('"rəng"=>"mavi", "ölçü"=>"L"');
Niyə JSONB HSTORE-u əvəz etdi?
HSTORE "açar-dəyər" üçün rahatdır, amma nested və array-ləri dəstəkləmir, bu da JSONB-ni daha universal edir. Əgər artıq sadə obyektlərdən böyümüsünüzsə, JSONB növbəti addımdır.
Əsas fərqlər
| Kriteriya | HSTORE | JSONB |
|---|---|---|
| Struktur | "Açar-dəyər" cütləri, nested yoxdur | Tam nested strukturlar |
| Array dəstəyi | Yoxdur | Var |
| Axtarış | Yalnız açara görə | Açar, dəyər və nested struktura görə |
| Nə vaxt istifadə etməli | Sadə açar-dəyər | Mürəkkəb data strukturları |
Uyğun data tipini necə seçmək olar?
Əgər sizdə:
- Sadə struktur — siyahılar və ya homogen data, array-lər (
ARRAY) istifadə edin. - Sadə mətn və ya təsvirlər, mətn sütunları (
TEXT) istifadə edin. - Nested olmayan "açar-dəyər" cütləri,
HSTOREseçin. - Nested obyektlər və array-lər, mürəkkəb data strukturu — sizə JSONB lazımdır.
Formatlar arasında çevirmə nümunələri
TEXT → JSONB
SELECT to_jsonb('Sadə mətn nümunəsi') AS jsonb_form;
-- Nəticə: "Sadə mətn nümunəsi"
JSONB → TEXT
SELECT info::TEXT AS text_form
FROM books_json;
-- Nəticə: {"title": "SQL Basics", "tags": ["beginner", "database"]}
HSTORE → JSONB
SELECT hstore_to_jsonb(attributes) AS jsonb_form
FROM products;
-- Nəticə: {"rəng": "qırmızı", "ölçü": "M"}
JSONB → HSTORE
SELECT jsonb_to_hstore('{"rəng": "qırmızı", "ölçü": "M"}') AS hstore_form;
-- Nəticə: "rəng"=>"qırmızı", "ölçü"=>"M"
Nəyə diqqət etmək lazımdır?
Əgər maksimum çeviklik və mürəkkəb strukturlar lazımdırsa, JSONB seçin. Amma tapşırığınız sadə data strukturlarıdırsa, məsələn array, mətn və ya "açar-dəyər" cütləri, uyğun data tipini (ARRAY, TEXT, HSTORE) istifadə edin.
Unutmayın, düzgün data strukturu seçimi gələcəkdə development zamanı baş ağrısından qoruyacaq və query-lərin performansını artıracaq.
GO TO FULL VERSION