CodeGym /Kurslar /SQL SELF /Massivlər və JSONB müqayisəsi

Massivlər və JSONB müqayisəsi

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

Bu gün qarşımızda məqsəd var: massivləri daha dərindən başa düşmək və onları JSONB ilə müqayisə etmək, üstün və zəif tərəflərini araşdırmaq və real tapşırıqlarda istifadə üçün ən yaxşı təcrübələri seçmək.

Massivlər vs JSONB: mini-tısbağa datalar vs qutuda çeviklik

Artıq yaxşı bilirsən ki, PostgreSQL-də massivlərdə yalnız bir tip data saxlamaq olar: rəqəmlər, sətirlər və ya tarixlərdən ibarət massiv. Məsələn: tələbənin qiymətləri siyahısı, burada bütün elementlər rəqəmdir.

-- Tələbələr və onların qiymətləri olan cədvəl
CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT,
    grades INTEGER[]    -- qiymətlərin massivi
);

JSONB isə massivdən fərqli olaraq, datanı JSON-strukturu kimi saxlayır. Bu, JavaScript-obyektinə bənzəyir, amma sürətli parsing və indeksləşdirmə üstünlüyü ilə. JSONB-də həm sıralı siyahılar, həm də açar-dəyər obyektləri saxlamaq olar.

-- Tələbələr və onlar haqqında müxtəlif datalar olan cədvəl
CREATE TABLE students_details (
    id SERIAL PRIMARY KEY,
    name TEXT,
    details JSONB  -- çevik JSON-struktur
);

JSONB-də data nümunəsi:

{
    "grades": [90, 82, 77],
    "address": {
        "city": "Berlin",
        "zip": "352912"
    }
}

Yəni, massivlər - dəyərlər siyahısı ilə işləmək üçün sadə yoldur, JSONB isə mürəkkəb datalar üçün daha çox imkan verir.

Massivlər və JSONB arasındakı əsas fərqlər

Əlamət Massivlər JSONB
Struktur tipi Xətti data strukturu Hierarxik data strukturu
Element tipləri Yalnız bir data tipi Fərqli data tipləri
Strukturun ölçüsü Sabit (xətti) Çevik, siyahı və obyektləri əhatə edə bilər
Əlçatanlıq sürəti Sabit datada yüksək Mürəkkəb axtarışlarda daha yavaş
İndeksləşdirmə İndeksləşdirməni yaxşı dəstəkləyir GIN tipli indeks tələb edir
Tətbiq sahəsi Sadə siyahı və ya dəyərlər massivi Mürəkkəb data: iç-içə obyektlər/siyahılar

İndi isə baxaq, bunlar praktikada necə işləyir.

Massivləri nə vaxt istifadə etməli?

Tutaq ki, kitablar olan bir database var və hər kitab bir neçə janra aid ola bilər. Burada massiv yaxşı seçimdir.

CREATE TABLE books (
    id SERIAL PRIMARY KEY,
    title TEXT,
    genres TEXT[]    -- janrların massivi
);

-- Bir neçə janrı olan kitab əlavə etmək nümunəsi
INSERT INTO books (title, genres)
VALUES ('1984', ARRAY['Dystopia', 'Political Fiction', 'Science Fiction']);

Massivlər yaxşıdır, əgər əminsənsə ki:

  • datani dəqiq siyahı kimi saxlamaq olar,
  • siyahılar kiçik və eyni tipli olacaq (məsələn, sətirlər və ya rəqəmlər),
  • sadəcə siyahı saxlamaq və çıxarmaq lazımdır (mürəkkəb əməliyyatsız).

Massivlərin üstünlükləri

  • Eyni tipli datanı saxlamaq asandır.
  • Tag, kateqoriya və ya qiymət kimi kiçik siyahılar üçün rahatdır.

JSONB nə vaxt istifadə etməli?

İndi isə təsəvvür et ki, kitablar haqqında daha mürəkkəb data saxlamaq istəyirsən: janrlar, ISBN və reytinq. Burada massivlər artıq işə yaramır — JSONB vaxtıdır.

CREATE TABLE books_details (
    id SERIAL PRIMARY KEY,
    title TEXT,
    details JSONB    -- kitab detalları JSONB kimi
);

-- Kitab haqqında mürəkkəb məlumat əlavə etmək nümunəsi
INSERT INTO books_details (title, details)
VALUES (
    '1984',
    '{"genres": ["Dystopia", "Political Fiction", "Science Fiction"],
      "isbn": "9780451524935",
      "rating": 8.9}'
);

JSONB yaxşıdır, əgər sənə lazımdırsa:

  • mürəkkəb və ya müxtəlif data saxlamaq (rəqəmlər, sətirlər, siyahılar, obyektlər),
  • tabloda struktur dəyişmədən dinamik parametrlər əlavə etmək,
  • iç-içə data saxlamaq (məsələn, ünvanlar, xüsusiyyətlər, ayarlar).

JSONB üstünlükləri

  • Çox çevikdir. Tablo strukturunu dəyişmədən yeni açar və dəyərlər əlavə edə bilərsən.
  • Mürəkkəb datanı saxlamaq üçün idealdır, məsələn, API-dən gələn JSON-cavablar.

Massiv və JSONB arasında seçim

Əgər yalnız eyni tipli data siyahısı saxlamaq lazımdırsa — massivlərdən istifadə et. Məsələn:

-- Tədbir iştirakçılarının ID-lərini saxlamaq
CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    participant_ids INTEGER[]
);

Əgər data müxtəlif və ya mürəkkəbdirsə — JSONB daha yaxşıdır. Məsələn:

-- Müştərilər haqqında ünvanlı məlumat saxlamaq
CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    info JSONB
);

İndeksləşdirmə üçün massiv və JSONB fərqli yanaşmalara malikdir. Massivlər üçün adətən GIN indekslər, JSONB üçün isə data strukturundan asılı olaraq həm GIN, həm də BTREE istifadə olunur.

Performans

Adi axtarış tapşırıqlarında massivlər daha sürətli işləyir. JSONB bir az yavaşdır, amma çevikliyi ilə üstünlük qazanır. Əgər sadəcə elementləri axtarmaq istəyirsənsə (məsələn, janr və ya ID), massivlər daha sürətli olacaq:

-- GIN indeksi ilə massivlərdən istifadə
CREATE INDEX idx_genres ON books USING GIN(genres);

-- Kitabları janra görə filtrləmək
SELECT * FROM books WHERE genres @> ARRAY['Science Fiction'];

Data olub-olmadığını yoxlamaq

JSONB-də açarlara görə filtrasiya üçün daha çox imkan var:

-- "genres" açarının olub-olmadığını yoxlamaq
SELECT * FROM books_details WHERE details ? 'genres';

-- Siyahıda element olub-olmadığını yoxlamaq
SELECT * FROM books_details WHERE details->'genres' ?| ARRAY['Fantasy', 'Dystopia'];

Massivlərdə isə dəyərləri birbaşa axtarmaq olar:

-- Massivdə element olub-olmadığını yoxlamaq
SELECT * FROM books WHERE genres @> ARRAY['Fantasy'];

Strukturların çevikliyi

Əgər data iç-içə və mürəkkəbdirsə, JSONB əvəzolunmazdır:

{
    "genres": ["Fantasy", "Adventure"],
    "ratings": {"goodreads": 8.5, "amazon": 4.7}
}

Massivlərlə bunu etmək mümkün deyil, yalnız normallaşdırma və ya əlavə sahələr ilə.

Nəticə olaraq, massivlər və JSONB rəqib deyil, fərqli tapşırıqlar üçün alətlərdir. Əgər data siyahıya bənzəyirsə — massivlərdən istifadə et. Əgər data mürəkkəb, iç-içə və ya müxtəlifdirsə — JSONB seç. Əsas odur ki, performansı və indeksləşdirməni unutma!

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Məlumatların saxlanması üçün massivlərdən istifadə
Məlumatların saxlanması üçün massivlərdən istifadə
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION