CodeGym /Kursy /SQL SELF /Praca z typem danych JSONB

Praca z typem danych JSONB

SQL SELF
Poziom 16 , Lekcja 1
Dostępny

JSON (JavaScript Object Notation) — to popularny format danych do wymiany informacji między systemami. Jest lekki, czytelny dla człowieka i idealnie nadaje się do przedstawiania strukturalnych danych, takich jak obiekty czy tablice.

PostgreSQL wspiera dwa typy danych do pracy z JSON:

  • JSON: przechowuje dane jako string. To czysto tekstowa reprezentacja JSON, bez wewnętrznej optymalizacji.
  • JSONB: binarna reprezentacja JSON. Jest bardziej wydajna do odczytu, filtrowania i przetwarzania, bo PostgreSQL wcześniej parsuje JSON i optymalizuje jego przechowywanie.

Dlaczego częściej wybiera się JSONB? Bo:

  • Jest szybszy dla zapytań dzięki binarnemu przechowywaniu.
  • Można go indeksować, co czyni go idealnym dla dużych zbiorów danych.
  • Zachowuje uporządkowane klucze i usuwa duplikaty, co upraszcza przetwarzanie.

Przykład struktury JSON:

{
  "name": "Alice",
  "age": 25,
  "skills": ["SQL", "PostgreSQL", "JSONB"]
}

Dlaczego JSONB jest przydatny?

Przechowywanie pół-strukturalnych danych. W realnym świecie dane często przychodzą jako złożone obiekty (np. metadane, ustawienia, profile użytkowników). JSONB pozwala je przechowywać bez tworzenia setek tabel i powiązań.

Modelowanie danych, które się zmieniają. Gdy struktura obiektu często się zmienia (np. dodawane lub usuwane są pola), JSONB pozwala elastycznie przechowywać takie dane.

Praca z API. Wiele aplikacji webowych wysyła dane w formacie JSON. Zamiast konwertować zapytania, można je przechowywać "jak leci" i pracować z nimi bezpośrednio.

Tworzenie tabeli z JSONB

No to lecimy z praktyką! Wyobraź sobie, że tworzymy bazę danych do przechowywania profili użytkowników.

Kolumna profile będzie przechowywać wszystkie dodatkowe informacje (np. wiek, zainteresowania, kontakty) w formacie JSON. To wygodne, jeśli struktura danych różni się u różnych użytkowników.

id name - VARCHAR(100) profile - JSONB
1 Alice {"age": 25, "skills": ["SQL", "PostgreSQL", "JSONB"], "location": "New York"}
2 Bob {"age": 30, "interests": ["hiking", "photography"], "location": "Denver"}
3 Charlie {"email": "charlie@example.com", "verified": true}
4 Diana {"age": 22, "skills": ["Python"], "bio": "Data enthusiast", "location": "Berlin"}
5 Eve {"age": 28, "skills": [], "preferences": {"theme": "dark", "notifications": false}}

Dane JSON można wstawiać jako stringi. PostgreSQL automatycznie konwertuje je do formatu JSONB.

Pobieranie danych z JSONB

Skoro mamy już dane, zobaczmy jak je pobierać. PostgreSQL daje sporo operatorów do pracy z JSONB.

Dostęp do wartości pola

Używamy operatora -> żeby dostać się do wartości pola:

-- Wyświetlamy wiek użytkownika
SELECT profile->'age' AS age FROM users;

Konwersja wartości na tekst

Operator ->> pozwala wyciągnąć wartość jako string:

-- Wyświetlamy miejsce zamieszkania użytkownika
SELECT profile->>'location' AS location FROM users;

Filtrowanie danych z JSONB

Moc JSONB pokazuje się przy zapytaniach z filtrowaniem. Możemy używać standardowych operatorów SQL do pracy z JSON.

Przykład filtrowania po kluczu:

-- Znajdź użytkowników, którzy mają miejsce zamieszkania "New York"
SELECT * FROM users
WHERE profile->>'location' = 'New York';

Szukaj w tablicy

JSON obsługuje tablice i PostgreSQL potrafi szukać w nich wartości:

-- Znajdź użytkowników, którzy znają SQL
SELECT * FROM users
WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'skills'));

Funkcja jsonb_array_elements_text zamienia elementy tablicy na stringi, żeby można było je porównać.

Jest też krótsza opcja z użyciem operatora @>:

-- Znajdź użytkowników, którzy znają SQL
SELECT * FROM users
WHERE profile->'skills' @> '["SQL"]';

Więcej o funkcjach i sposobach pracy z JSON pogadamy później, jak przyjdzie na to czas :P

Krótkie podsumowanie: kiedy używać JSONB

JSONB świetnie się sprawdza do:

  • Przechowywania złożonych, strukturalnych danych.
  • Przetwarzania danych z zewnętrznych API.
  • Sytuacji, gdy struktura obiektu się zmienia.

Ale pamiętaj, że przesadne używanie JSONB może utrudnić indeksowanie i zarządzanie bazą danych. Jeśli struktura danych jest stabilna, lepiej użyć modelu relacyjnego.

Komentarze (1)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Min Poziom 26, Warsaw, Poland
10 października 2025
Cześć, PostgreSQL 17.6 SELECT * FROM users WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'skills')); Query 1 ERROR at Line 50: : ERROR: set-returning functions are not allowed in WHERE LINE 2: WHERE 'SQL' == ANY(jsonb_array_elements_text(profile->'skill... ^