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.
GO TO FULL VERSION