CodeGym /Kurslar /SQL SELF /JSONJSONB müqayisəsi: hər ...

JSONJSONB müqayisəsi: hər formatın üstünlükləri və çatışmazlıqları

SQL SELF
Səviyyə , Dərs
Mövcuddur

JSON və JSONB arasındakı əsas fərqlərdən biri məlumatların saxlanma formatıdır. JSON məlumatları mətn kimi saxlayır, JSONB isə binar formada. Bu o deməkdir ki:

  • JSON məlumatları sən necə göndərmisənsə, elə o cür saxlayır. Məsələn, əgər sən {"title": "PostgreSQL", "tags": ["database", "SQL"]} sətrini əlavə edirsənsə, o, olduğu kimi saxlanacaq.
  • JSONB əvvəlcə JSON-obyekti parse edir, lazımsız boşluqları silir, açarları sıralayır, strukturu optimallaşdırır və yalnız bundan sonra onu binar formatda saxlayır.

Bu optimizasiya JSONB-yə məlumatlarla daha sürətli işləməyə imkan verir, xüsusilə mürəkkəb filter, axtarış və sort sorğularında.

Oxuma və yazma əməliyyatlarının performansı

JSON və JSONB məlumatların oxunması və yazılması sürətinə görə fərqli xüsusiyyətlərə malikdir:

  • JSON bazaya daha tez yazılır, çünki saxlamadan əvvəl məlumatları parse etməyə ehtiyac yoxdur. Amma belə məlumatların oxunması və işlənməsi adətən daha yavaşdır, çünki PostgreSQL sorğu zamanı məlumatları yenidən parse etməlidir.
  • JSONB yazı zamanı daha çox vaxt tələb edir, çünki saxlamadan əvvəl məlumatlar emal olunur. Amma məlumatların oxunması, filtrasiyası və dəyərlərin çıxarılması xeyli sürətlidir, bu da JSONB-ni analitik və ya axtarış tapşırıqları üçün daha üstün edir.

Misal üçün daha aydın olsun deyə:

-- JSON və JSONB ilə cədvəllərin yaradılması
CREATE TABLE json_example (data JSON);
CREATE TABLE jsonb_example (data JSONB);

-- Məlumatların əlavə olunması
INSERT INTO json_example VALUES ('{"key": "value", "tags": ["json", "example"]}');
INSERT INTO jsonb_example VALUES ('{"key": "value", "tags": ["jsonb", "example"]}');

-- Məlumatların filtrasiyası
SELECT * FROM json_example WHERE data->'key' = '"value"';  -- Daha yavaş
SELECT * FROM jsonb_example WHERE data->'key' = '"value"'; -- Daha sürətli

Məlumatların indeksləşdirilməsi

JSONB-nin ən böyük üstünlüklərindən biri indeksləşdirməni dəstəkləməsidir. PostgreSQL JSONB sütunları üçün GIN tipli indekslər yaratmağa imkan verir. Bu, axtarış və filtrasiyanı xeyli sürətləndirir.

İndeks yaradılması nümunəsi:

-- JSONB sütununda indeks
CREATE INDEX idx_jsonb_tags ON jsonb_example USING gin (data->'tags');

JSON isə indeksləşdirməni dəstəkləmir, bu da onu mürəkkəb axtarış və filtrasiya əməliyyatları üçün az uyğun edir.

Hansını seçmək lazımdır: JSON yoxsa JSONB

JSON ən yaxşı halda istifadə olunur ki:

  • Məlumatları ilkin formada, dəyişmədən saxlamaq lazımdır.
  • JSON məlumatları üzərində aktiv filter, axtarış və ya sort sorğuları etməyi planlaşdırmırsan.
  • JSON məlumatları əsasən başqa sistemlərə və ya klientlərə dəyişmədən ötürülür (məsələn, API vasitəsilə frontend-ə göndərmək üçün).

Misal:

-- JSON-u analiz etmədən saxlamaq
CREATE TABLE api_responses (
    id SERIAL PRIMARY KEY,
    response JSON
);

-- Məlumatların API-dən gəldiyi kimi əlavə olunması
INSERT INTO api_responses (response)
VALUES ('{"status": "success", "payload": {"id": 123, "name": "John"}}');

JSONB istifadə etmək daha yaxşıdır, əgər:

  • Məlumatların içindəki dəyərlərə görə aktiv filter, axtarış, qruplaşdırma və ya sort etməyi planlaşdırırsan.
  • Məlumatlara çıxış performansı yazı performansından daha vacibdir.
  • JSON məlumatları ilə əməliyyatları sürətləndirmək üçün indeksləşdirmədən istifadə etmək istəyirsən.

Misal:

-- Analiz və nested obyektlərlə işləmək üçün JSONB saxlamaq
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    details JSONB
);

-- Məlumatların əlavə olunması
INSERT INTO products (details)
VALUES ('{"name": "Laptop", "price": 1200, "tags": ["electronics", "computers"]}');

-- "electronics" tag-ı olan məhsulların axtarışı
SELECT * FROM products
WHERE details @> '{"tags": ["electronics"]}';

@> və --> operatorları haqqında daha ətraflı növbəti mühazirələrdə öyrənəcəksən :P

JSONJSONB ilə işləmə nümunələri

İki cədvəl yaradaq: biri JSON sütunu ilə, digəri JSONB ilə:

CREATE TABLE json_table (
    id SERIAL PRIMARY KEY,
    data JSON
);

CREATE TABLE jsonb_table (
    id SERIAL PRIMARY KEY,
    data JSONB
);

Hər iki cədvələ məlumat əlavə etmək eyni cür olacaq:

INSERT INTO json_table (data)
VALUES ('{"key": "value", "tags": ["json", "example"]}');

INSERT INTO jsonb_table (data)
VALUES ('{"key": "value", "tags": ["jsonb", "example"]}');

İndi isə key açarının dəyəri value olan məlumatları çıxarmağa çalışaq:

-- JSON üçün
SELECT * FROM json_table
WHERE data->>'key' = 'value';

-- JSONB üçün
SELECT * FROM jsonb_table
WHERE data->>'key' = 'value';

Az miqdarda məlumat üçün performans fərqi demək olar ki, hiss olunmur. Amma milyonlarla sətrdə JSONB xeyli yaxşı nəticə göstərəcək, xüsusilə indeks yaratsan:

CREATE INDEX idx_jsonb_key ON jsonb_table USING gin ((data->>'key'));

Nested obyektlər və massivlərlə işləmək də JSONB-də daha effektivdir:

-- Massivdən dəyər çıxarmaq
SELECT data->'tags'->>0 AS first_tag 
FROM jsonb_table;

Üstünlüklər və çatışmazlıqlar

Xüsusiyyət JSON JSONB
Məlumatların saxlanması Məlumatları ilkin mətn formatında saxlayır Məlumatları binar formatda, açarları sıralayaraq saxlayır
Yazma performansı Daha sürətli, çünki "olduğu kimi" saxlanılır Parse olunduğuna görə bir az yavaşdır
Oxuma performansı Daha yavaş, çünki sorğu zamanı parse etmək lazımdır Daha sürətli, çünki məlumatlar artıq oxuma üçün optimallaşdırılıb
İndeksləşdirmə Dəstəklənmir Dəstəklənir (GIN, BTREE indeksləri)
Filtrasiya Yavaşdır Sürətlidir
Əməliyyat dəstəyi Məhduddur Genişdir

JSON və JSONB arasında seçim tapşırığın xarakterindən asılıdır. Əgər sadəcə məlumatları dəyişmədən mətn kimi saxlamaq lazımdırsa, rahatlıqla JSON seç. Amma sütunların içindəki məlumatlarla aktiv işləmək, filter, axtarış və ya qruplaşdırma etmək istəyirsənsə, JSONB həm daha performanslı, həm də daha rahatdır.

Əgər mürəkkəb tətbiqlər qurursansa və JSON məlumatları sadəcə "arxiv" yox, həm də analitikada aktiv istifadə olunacaqsa, JSONB sənin üçün əvəzolunmaz olacaq. Yəni, əmin deyilsənsə — JSONB seç. Ola bilsin, gələcəkdə "ən sürətli sorğun" bunun üçün sənə təşəkkür edəcək!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION