PostgreSQL do zarządzania JSON

PostgreSQL do zarządzania JSON
Jednym z wielu typów danych, które obsługuje PostgreSQL, jest JSON. Ponieważ większość komunikacji interfejsów API Web ogromnie korzysta z ładunku JSON, ta funkcja jest raczej ważna. Zamiast używać typu danych PlainText do przechowywania obiektów JSON, Postgres ma inny typ danych, który jest zoptymalizowany pod kątem ładunków JSON, weryfikuje, że dane przechowywane w tych polach potwierdzają specyfikację RFC. Również w klasyczny sposób, pozwala dostosować pola JSON w celu uzyskania maksymalnej wydajności.

Podczas tworzenia tabeli będziesz mieć dwie opcje dla swojej kolumny JSON. Zwykły typ danych JSON i typ danych JSONB, oba mają własne zalety i wady. Przejdziemy przez każdą z nich, tworząc prostą tabelę z zaledwie 2 kolumnami identyfikatorem i wartością JSON. Po tym będziemy zapytać dane z tabeli i wyczumy, jak zarządzać danymi sformatowanymi JSON w Postgres.

Typ danych JSON

Tworzenie tabeli z typem danych JSON

Utwórzmy prostą dwuprolumnową tabelę o nazwie Użytkownicy:

Utwórz użytkowników tabeli (
ID szeregowy nie zerowy klucz podstawowy,
Informacje JSON NOT NULL
);

Tutaj identyfikator kolumny działa jako klucz podstawowy i wzrośnie w sposób przyrostowy dzięki pseudotypowi serialowi, więc nie będziemy musieli martwić się o ręczne wprowadzenie wartości identyfikatorów.

Druga kolumna jest typu JSON i jest zmuszona nie być zerowa. Wprowadźmy kilka wierszy danych do tej tabeli, składających się z wartości JSON.

Wstaw wartości użytkowników (Info) (
'
„Nazwa”: „Jane Doe”,
„E -mail”: „Janedoe@przykład.com ",
„PersonalDetails”: „wiek”: 33, „płeć”: „f”
');
Wstaw wartości użytkowników (Info) (
'
„Nazwa”: „Jane Doe”,
„E -mail”: „Janedoe@przykład.com ",
„PersonalDetails”: „wiek”: 33, „płeć”: „f”
');

Możesz użyć preferowanego JSON Beautifier/Minifier do konwersji ładunków JSON powyżej na jedną linię. Więc możesz wkleić go przy przejściu do podpowiedzi PSQL.

Wybierz * od użytkowników;
Id | informacje
----+------------------------------------------------------
1 | „Nazwa”: „John Doe”, „E -mail”: „Johndoe@przykład.com "…
2 | „Nazwa”: „Jane Doe”, „E -mail”: „Janedoe@przykład.com "…
(2 wiersze)

Polecenie Select na końcu pokazało nam, że wiersze zostały pomyślnie włożone do tabeli użytkowników.

Zapytanie typu danych JSON

Postgres umożliwia kopanie w samym ładunku JSON i odzyskanie określonej wartości, jeśli odniesiesz się do niej za pomocą odpowiedniej wartości. Możemy użyć operatora -> po nazwie kolumny JSON, a następnie klawisz wewnątrz obiektu JSON. Robiąc tak
Na przykład w tabeli, którą stworzyliśmy powyżej:

Wybierz informacje -> „e -mail” od użytkowników;
----+----------------------------------------
Id | ?kolumna?
----+----------------------------------------
1 | „Johndoe@przykład.com "
2 | „przykład@[email protected] "

Być może zauważyłeś podwójne cytaty w kolumnie zawierającej e -maile. Wynika to z faktu, że operator -> zwraca obiekt JSON, jak obecny w wartości kluczowej „e -mail”. Oczywiście możesz zwrócić tylko SMS, ale zamiast tego będziesz musiał użyć operatora ->>.

Wybierz informacje ->> „E -mail” od użytkowników;
Id | ?kolumna?
----+----------------------------------------
1 | Johndoe@Przykład.com
2 | Janedoe@Przykład.com

Różnica między zwróceniem obiektu JSON a ciągiem staje się jasna, gdy zaczniemy pracować z obiektami JSON zagnieżdżonymi w innych obiektach JSON. Na przykład wybrałem klucz „PersonalDetail”, aby celowo zatrzymać inny obiekt JSON. Możemy również zagłębić się w ten obiekt, jeśli chcemy:

Wybierz informacje -> „PersonalDetails” -> „Płeć” od użytkowników;
?kolumna?
----------
"M"
"F"
(2 wiersze)

To może pozwolić ci przejść tak głęboko w obiekt JSON, jak chcesz. Upuśćmy tę tabelę i utwórz nową (o tej samej nazwie), ale z typem JSONB.

Typ danych JSONB

Z wyjątkiem faktu, że podczas tworzenia tabeli wspominamy typ danych JSONB zamiast JSON, wszystko inne Wygląd ten sam.

Utwórz użytkowników tabeli (
ID szeregowy nie zerowy klucz podstawowy,
Informacje JSONB NOT NULL
);

Nawet wstawienie danych i wyszukiwania za pomocą operatora -> zachowuje się w ten sam sposób. To, co się zmieniło, jest pod maską i zauważalne w występie. Podczas konwersji tekstu JSON w JSONB Postgres faktycznie zamienia różne typy wartości JSON w rodzime typu Postgres, więc nie wszystkie prawidłowe obiekty JSON można zapisać jako prawidłową wartość JSONB.

Co więcej, JSONB nie zachowuje białychpaceów, zamówienia JSON Keys dostarczonych przez instrukcję Insert. JSONB faktycznie przekształca ładunek w binarny natywnych Postgres, stąd termin JSONB.

Oczywiście, wstawienie punktu odniesienia JSONB ma narzut wydajności ze względu na wszystkie te dodatkowe prace, które muszą wykonać Postgres. Jednak zaletą, którą zyskujesz, jest szybsze przetwarzanie już przechowywanych danych, ponieważ aplikacja nie byłaby konieczna przeanalizowania ładunku JSON za każdym razem, gdy pobiera jedną z bazy danych.

JSON vs Jsonb

Decyzja między JSON a JSONB SOLE zależy od twojego przypadku użycia. W razie wątpliwości użyj JSONB, ponieważ większość aplikacji ma częstsze operacje odczytu, które piszą operacje. Z drugiej strony, jeśli masz pewność, że Twoja aplikacja ma wykonać więcej synchronicznych operacji pisania niż odczyt, możesz uznać JSON za alternatywę.

Wniosek

Osoby pracujące z ładunkami JSON i projektowanie interfejsów dla Postgres Storage przyniosą ogromne korzyści z tej konkretnej sekcji ich oficjalnej dokumentacji. Deweloperzy byli na tyle mili, aby dostarczyć nam indeksowanie JSONB i inne fajne funkcje, które można wykorzystać w celu poprawy wydajności i prostoty aplikacji. Błagam cię, abyś je również zbadał.
Mamy nadzieję, że znalazłeś to krótkie wprowadzenie sprawy pomocne i inspirujące.