CodeGym /Kurslar /SQL SELF /JSON-un digər tiplərlə müqayisəsi: ARRAY, ...

JSON-un digər tiplərlə müqayisəsi: ARRAY, TEXT, HSTORE

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

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 GINBTREE 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, HSTORE seç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.

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