Czasem struktura danych nie mieści się w klasycznych kolumnach typu string czy liczba. Na przykład użytkownik może mieć listę hobby, dowolne ustawienia profilu albo zagnieżdżone parametry zamówienia. Tworzenie osobnych tabel pod to wszystko — serio niewygodne. Tu właśnie wchodzi JSON.
PostgreSQL ogarnia dwa formaty do takich danych: JSON i JSONB. Oba pozwalają trzymać strukturalne dane w jednej kolumnie, ale mają ważne różnice.
Sprawdźmy, jak to działa, kiedy używać którego formatu i jakie możliwości dają.
Co to jest JSON
JSON (JavaScript Object Notation) — to tekstowy format wymiany danych, stworzony dla wygodnego przedstawiania danych strukturalnych. Ten format jest dobrze znany każdemu devowi, który robi webowe apki, i można go opisać jako "czytelny dla człowieka" i "łatwy do parsowania przez kompa". W PostgreSQL ten format służy do przechowywania i ogarniania danych strukturalnych.
Przykład obiektu JSON:
{
"name": "Alex Lin",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JavaScript"],
"address": {
"city": "Berlin",
"postal_code": "10115"
}
}
Uwaga: JSON to po prostu tekst, ale tekst z zasadami. Na przykład klucze zawsze są w cudzysłowie.
JSONB: Binary JSON
JSONB — to "binarny JSON", który też jest wspierany przez PostgreSQL. W przeciwieństwie do JSON, JSONB można indeksować i jest zoptymalizowany pod szybkie wyszukiwanie i zmiany. Główna różnica między JSON a JSONB w PostgreSQL to sposób przechowywania:
- JSON jest trzymany jako tekst, dokładnie tak, jak wrzucisz dane.
- JSONB zamienia dane na format binarny, który jest wydajniejszy dla większości operacji.
JSONB daje ci takie ficzery: filtrowanie, indeksowanie, porównywanie złożonych zagnieżdżonych struktur.
Główne zalety JSONB
Czemu warto wybrać JSONB zamiast JSON? Oto kilka powodów:
- Przyspieszenie wyszukiwania i filtrowania
JSONB jest stworzony do szybkiego wyciągania danych. Na przykład, jeśli masz dużą tablicę obiektów, JSONB pozwala szybko znaleźć potrzebny element bez przeszukiwania wszystkiego.
- Możliwość indeksowania
Dzięki indeksowaniu możesz szukać po kluczach i wartościach w JSONB, a zapytania są błyskawiczne. Traktowanie JSON jako tekstu (w formacie JSON) nie pozwala na indeksowanie.
- Wygoda pracy z zagnieżdżonymi danymi
JSONB świetnie radzi sobie ze złożonymi strukturami. Nie musisz mnożyć tabel do pracy z danymi hierarchicznymi — wszystko może być kompaktowo spakowane.
Kiedy używać JSON, a kiedy JSONB
- JSON warto użyć, jeśli chcesz zachować dane "jak są" w formie tekstowej. Na przykład, gdy ważny jest dokładny zapis danych albo minimalna obróbka.
- JSONB przyda się, jeśli planujesz aktywnie robić selekty, filtrowania i modyfikacje danych, albo jeśli potrzebujesz indeksowania.
Przykłady obiektów JSON
Przejdźmy przez kilka przykładów obiektów JSON, żeby zobaczyć, jak mogą wyglądać ich struktury.
Prosty obiekt JSON.
Struktura klucz-wartość:
{
"name": "Kate",
"age": 29
}
Tablice w JSON
JSON obsługuje tablice:
{
"skills": ["Python", "SQL", "Data Analysis"]
}
Zagnieżdżone obiekty
JSON pozwala tworzyć układy do przechowywania złożonych danych:
{
"name": "Andrew",
"contacts": {
"email": "andrey@example.com",
"phone": "+79012345678"
}
}
Kombinowanie tablic i obiektów
Możesz łączyć tablice i obiekty:
{
"team": [
{
"name": "Helen",
"role": "menedżer"
},
{
"name": "Paweł",
"role": "developer"
}
]
}
JSON i PostgreSQL
PostgreSQL wspiera dwa osobne typy danych do pracy z JSON:
JSON: format tekstowy.JSONB: format binarny.
Tworzenie tabeli z kolumnami JSON i JSONB
Zobaczmy, jak można użyć JSON/JSONB w tabelach PostgreSQL. Na przykład, stwórzmy tabelę do przechowywania info o pracownikach firmy:
-- Tworzymy tabelę z kolumnami JSON i JSONB
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
details JSON, -- tekstowy JSON
profile JSONB -- binarny JSON
);
Na pierwszy rzut oka wydaje się, że nie ma różnicy między tymi kolumnami. Ale to nie tak: JSON idealnie nadaje się do przechowywania danych w niezmienionej formie, a JSONB lepiej sprawdza się przy filtrowaniu i wyszukiwaniu.
-- Wstawiamy dane
INSERT INTO employees (name, details, profile)
VALUES
('Alex Lin', '{"age": 30, "city": "Tallinn"}', '{"skills": ["SQL", "PostgreSQL"], "hobby": "football"}'),
('Maya Novak', '{"age": 25, "city": "Riga"}', '{"skills": ["Python", "Machine Learning"], "hobby": "reading"}');
Wyciąganie danych z JSONB
Możesz wyciągać dane z JSONB za pomocą specjalnych funkcji, które ogarniemy w następnej lekcji. Na przykład, żeby sprawdzić skille pracowników:
-- Wyciąganie umiejętności
SELECT name, profile->'skills' AS skills
FROM employees;
Wynik:
| name | skills |
|---|---|
| Alex Lin | ["SQL", "PostgreSQL"] |
| Maya Novak | ["Python", "Machine Learning"] |
Zastosowanie JSON w realu
JSON (i JSONB) jest szeroko używany w prawdziwych apkach. Oto kilka przykładów:
- API i mikroserwisy. JSON to standardowy format wymiany danych w RESTful API. PostgreSQL wspiera go na poziomie przechowywania i przetwarzania.
- Integracja danych. Jeśli twoja baza dostaje dane z różnych systemów, praca z JSONB będzie wygodniejsza.
- Ogarnianie złożonych struktur. Na przykład, JSONB nadaje się do przechowywania danych z ankiet, ustawień użytkownika czy firmowych metadanych.
GO TO FULL VERSION