0Pricing
SQL Academy · Lekcja

JSONB a JSON: kiedy używać którego

Wybierać między JSON (tekst, zachowuje białe znaki) a JSONB (format binarny, indeksowalny, z usuniętymi duplikatami kluczy), aby dobrać właściwy sposób przechowywania

JSONB a JSON: kiedy używać którego to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Dwa typy JSON w PostgreSQL

  • JSON — przechowuje dokładny tekst przekazany podczas zapisu
  • JSONB — rozłożony format binarny z usuniętymi duplikatami kluczy, obsługujący indeksowanie

JSON: przechowywanie tekstu

JSON zachowuje białe znaki, kolejność kluczy i zduplikowane klucze. Przy każdym odczycie jest ponownie analizowany. Nie obsługuje indeksowania GIN. W przypadku nowego kodu niemal nigdy nie jest właściwym wyborem.

INSERT INTO docs (data) VALUES ('{"a": 1, "a": 2}'::JSON);
SELECT data->'a' FROM docs;     -- whatever the parser picks

JSONB: binarny i indeksowalny

JSONB:

  • Przechowywany w rozłożonej postaci → nie wymaga ponownej analizy przy odczycie
  • Zduplikowane klucze są scalane (wygrywa ostatni)
  • Kolejność kluczy nie jest zachowywana
  • Obsługuje indeksowanie GIN
  • Obsługuje rozbudowane operatory ścieżek

Przykład JSONB

Prosta tabela zdarzeń:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  data JSONB NOT NULL
);

INSERT INTO events (data) VALUES
  ('{"type":"login","user_id":42,"ip":"1.2.3.4"}');

Operatory ścieżek

JSONB udostępnia rozbudowane operatory (omówione w następnej lekcji):

SELECT data->'user_id'   FROM events;       -- → JSONB
SELECT data->>'user_id'  FROM events;       -- → TEXT
SELECT data #>> '{user,name}' FROM events;  -- nested text path

Zawieranie

Najbardziej użyteczny operator JSONB: @> (zawiera).

SELECT * FROM events WHERE data @> '{"type":"login"}';

-- Combined with a GIN index, this is fast even on billions of rows.

Równość wartości JSONB

Dwie wartości JSONB są równe, jeśli ich zawartość jest taka sama — kolejność kluczy nie ma znaczenia:

SELECT '{"a":1,"b":2}'::JSONB = '{"b":2,"a":1}'::JSONB;    -- TRUE

Rzutowanie między typami

Można swobodnie rzutować:

SELECT '{"a":1}'::JSONB->'a';                -- 1 (as JSONB)
SELECT ('{"a":1}'::JSONB)->>'a';             -- '1' (as TEXT)
SELECT ('{"a":1}'::JSONB)->'a'::INT;          -- 1 (as INT after extraction)

Kiedy NIE używać JSONB

Jeśli dane mają stałą strukturę, należy użyć rzeczywistych kolumn:

  • Szybsze zapytania (bez analizy dokumentu dla każdego wiersza)
  • Silne typowanie i ograniczenia
  • Mniejsze zużycie miejsca
  • Lepsze statystyki

JSONB sprawdza się najlepiej, gdy struktura danych jest zmienna lub szybko ewoluuje.

Modelowanie hybrydowe

Najlepsza praktyka: uporządkowane kolumny dla stabilnych pól, JSONB dla zmiennych danych dodatkowych:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL,
  event_type TEXT NOT NULL,
  user_id BIGINT,
  extra JSONB NOT NULL DEFAULT '{}'::JSONB
);

Walidacja

JSONB przechowuje dowolny prawidłowy JSON. Aby wymusić ograniczenia strukturalne, należy użyć ograniczeń CHECK lub egzekwować schemat w warstwie aplikacji:

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type');

Podsumowanie

JSONB > JSON w niemal wszystkich zastosowaniach produkcyjnych.

  • JSONB: binarny, indeksowany, szybkie ścieżki dostępu
  • JSON: tylko tekstowy zapis i odczyt bez zmian
  • JSONB należy stosować dla zmiennych struktur, a rzeczywiste kolumny dla struktur stałych

Szybkie sprawdzenie

Projektują Państwo nową tabelę do przechowywania dokumentów JSON przesyłanych przez użytkowników, które będą wyszukiwane według zawartości. JSON czy JSONB?

Często zadawane pytania

Czy lekcja „JSONB a JSON: kiedy używać którego” jest bezpłatna?

Tak — pełny tekst „JSONB a JSON: kiedy używać którego” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „JSONB a JSON: kiedy używać którego”?

Wybierać między JSON (tekst, zachowuje białe znaki) a JSONB (format binarny, indeksowalny, z usuniętymi duplikatami kluczy), aby dobrać właściwy sposób przechowywania Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „JSONB a JSON: kiedy używać którego”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. JSONB a JSON: kiedy używać którego
  2. Operatory ścieżek: -> ->> @>
  3. Indeksowanie JSONB za pomocą GIN
  4. Modelowanie: kiedy JSONB wygrywa z normalizacją
← Powrót do SQL Academy