CodeGym /Kursy /SQL SELF /Praca z JSON i JSONB

Praca z JSON i JSONB

SQL SELF
Poziom 33 , Lekcja 0
Dostępny

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:

  1. 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.

  1. 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.

  1. 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:

  1. API i mikroserwisy. JSON to standardowy format wymiany danych w RESTful API. PostgreSQL wspiera go na poziomie przechowywania i przetwarzania.
  2. Integracja danych. Jeśli twoja baza dostaje dane z różnych systemów, praca z JSONB będzie wygodniejsza.
  3. Ogarnianie złożonych struktur. Na przykład, JSONB nadaje się do przechowywania danych z ankiet, ustawień użytkownika czy firmowych metadanych.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION