Dzisiaj mamy zadanie lepiej ogarnąć tablice i też głębiej porównać je z JSONB, zobaczyć ich mocne i słabe strony i wybrać najlepsze praktyki do użycia w realnych zadaniach.
Tablice vs JSONB: mini-żółwiki danych vs elastyczność w pudełku
Już dobrze wiesz, że w tablicach PostgreSQL możesz trzymać wartości tylko jednego typu danych: tablica liczb, stringów albo dat. Przykład: lista ocen studenta, gdzie wszystkie elementy to liczby.
-- Tabela ze studentami i ich ocenami
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT,
grades INTEGER[] -- tablica ocen
);
JSONB, w przeciwieństwie do tablicy, to przechowywanie danych w formie struktury JSON. To bardzo przypomina wszystkim znany obiekt JavaScript, ale z plusem szybkiego parsowania i indeksowania. W JSONB możesz trzymać zarówno uporządkowane listy, jak i obiekty z kluczami i wartościami.
-- Tabela ze studentami i różnymi danymi o nich
CREATE TABLE students_details (
id SERIAL PRIMARY KEY,
name TEXT,
details JSONB -- elastyczna struktura JSON
);
Przykład danych w JSONB:
{
"grades": [90, 82, 77],
"address": {
"city": "Berlin",
"zip": "352912"
}
}
No więc, tablice — to uproszczony sposób pracy z listami wartości, a JSONB daje dużo więcej możliwości dla złożonych danych.
Główne różnice między tablicami a JSONB
| Cecha | Tablice | JSONB |
|---|---|---|
| Typ struktury | Liniowa struktura danych | Hierarchiczna struktura danych |
| Typy elementów | Tylko jeden typ danych | Różne typy danych |
| Rozmiar struktury | Stały (liniowy) | Elastyczny, może zawierać listy i obiekty |
| Szybkość dostępu | Wysoka przy stałych danych | Wolniej przy złożonych wyszukiwaniach |
| Indeksowanie | Dobrze wspiera indeksowanie | Wymaga indeksu typu GIN |
| Zastosowanie | Prosta lista lub tablica wartości | Złożone dane: zagnieżdżone obiekty/listy |
Teraz zobaczmy, jak to wszystko działa w praktyce.
Kiedy używać tablic?
Załóżmy, że mamy bazę danych z książkami, gdzie każda książka może należeć do kilku gatunków. Tablica tutaj będzie dobrym wyborem.
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title TEXT,
genres TEXT[] -- tablica gatunków
);
-- Przykład wstawienia książki z kilkoma gatunkami
INSERT INTO books (title, genres)
VALUES ('1984', ARRAY['Dystopia', 'Political Fiction', 'Science Fiction']);
Tablice są spoko, jeśli jesteś pewny, że:
- twoje dane można spokojnie trzymać jako listę,
- listy będą małe i jednego typu (np. stringi albo liczby),
- potrzebujesz po prostu przechowywać i pobierać listy (bez skomplikowanych operacji).
Zalety tablic
- Prostota przechowywania jednego typu danych.
- Wygodne dla małych list, takich jak tagi, kategorie czy oceny.
Kiedy używać JSONB?
Teraz wyobraź sobie, że chcesz trzymać bardziej złożone dane o książkach, w tym gatunki, ISBN i ocenę. Tutaj tablice już nie wystarczą — czas na JSONB.
CREATE TABLE books_details (
id SERIAL PRIMARY KEY,
title TEXT,
details JSONB -- szczegóły książki jako JSONB
);
-- Przykład wstawienia złożonych informacji o książce
INSERT INTO books_details (title, details)
VALUES (
'1984',
'{"genres": ["Dystopia", "Political Fiction", "Science Fiction"],
"isbn": "9780451524935",
"rating": 8.9}'
);
JSONB jest super, jeśli musisz:
- przechowywać złożone lub różnorodne dane (liczby, stringi, listy, obiekty),
- dynamicznie dodawać parametry bez zmiany struktury tabeli,
- trzymać zagnieżdżone dane (np. adresy, cechy, ustawienia).
Zalety JSONB
- Duża elastyczność. Możesz dodawać nowe klucze i wartości bez zmiany struktury tabeli.
- Idealny do przechowywania złożonych danych, np. odpowiedzi JSON z API.
Wybór między tablicami a JSONB
Jeśli musisz przechowywać tylko listy jednego typu danych — używaj tablic. Na przykład:
-- Przechowywanie ID uczestników wydarzeń
CREATE TABLE events (
id SERIAL PRIMARY KEY,
participant_ids INTEGER[]
);
Jeśli dane są różnorodne lub złożone — lepiej użyć JSONB. Na przykład:
-- Przechowywanie informacji o klientach z adresami
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
info JSONB
);
Pod indeksowanie tablice i JSONB mają różne podejścia. Dla tablic najczęściej używa się indeksów GIN, a dla JSONB — GIN i BTREE, zależnie od struktury danych.
Wydajność
Tablice są szybsze przy typowych zadaniach wyszukiwania. JSONB jest trochę wolniejszy, ale wygrywa elastycznością. Jeśli chcesz po prostu szukać elementów (np. gatunki albo ID), tablice będą szybsze:
-- Użycie tablic z indeksem GIN
CREATE INDEX idx_genres ON books USING GIN(genres);
-- Filtrowanie książek po gatunku
SELECT * FROM books WHERE genres @> ARRAY['Science Fiction'];
Sprawdzanie obecności danych
W JSONB masz więcej możliwości filtrowania po kluczach:
-- Sprawdzenie obecności klucza "genres"
SELECT * FROM books_details WHERE details ? 'genres';
-- Sprawdzenie obecności elementu w liście
SELECT * FROM books_details WHERE details->'genres' ?| ARRAY['Fantasy', 'Dystopia'];
Tablice pozwalają szukać wartości bezpośrednio:
-- Sprawdzenie obecności elementu w tablicy
SELECT * FROM books WHERE genres @> ARRAY['Fantasy'];
Elastyczność struktur
JSONB będzie niezastąpiony, jeśli dane mają złożone zagnieżdżone struktury:
{
"genres": ["Fantasy", "Adventure"],
"ratings": {"goodreads": 8.5, "amazon": 4.7}
}
Dla tablic to będzie nieosiągalne bez normalizacji albo dodatkowych pól.
Podsumowując, tablice i JSONB — to nie konkurenci, tylko narzędzia do różnych zadań. Jeśli dane wyglądają jak lista — używaj tablic. Jeśli masz złożone, zagnieżdżone albo różnorodne dane — śmiało bierz JSONB. Najważniejsze — pamiętaj o wydajności i indeksowaniu!
GO TO FULL VERSION