Najpierw hstore
to moduł contrib, który pozwala tylko na przechowywanie par klucz => wartości, gdzie klucze i wartości mogą być tylko text
s (jednak wartości mogą być sql NULL
s też).
Oba json
&jsonb
umożliwia przechowywanie prawidłowej wartości JSON (zdefiniowane w specyfikacji).
Np. są to poprawne reprezentacje JSON:null
, true
, [1,false,"string",{"foo":"bar"}]
, {"foo":"bar","baz":[null]}
- hstore
to tylko mały podzbiór w porównaniu do możliwości JSON (ale jeśli potrzebujesz tylko tego podzbioru, jest w porządku).
Jedyna różnica między json
&jsonb
jest ich przechowywanie:
json
jest przechowywany w formacie zwykłego tekstu, podczas gdyjsonb
jest przechowywany w postaci binarnej
Są to 3 główne konsekwencje:
jsonb
zwykle zajmuje więcej miejsca na dysku do przechowywania niżjson
(czasami nie)jsonb
kompilacja z jego reprezentacji wejściowej zajmuje więcej czasu niżjson
json
operacje zajmują znacznie więcej czasu niżjsonb
(&parsowanie musi być również wykonywane za każdym razem, gdy wykonujesz jakąś operację najson
wpisana wartość)
Kiedy jsonb
będzie dostępny w wersji stabilnej, będą dwa główne przypadki użycia, w których będzie można łatwo wybierać między nimi:
- Jeśli pracujesz tylko z reprezentacją JSON w swojej aplikacji, PostgreSQL jest używany tylko do przechowywania i pobierania tej reprezentacji, powinieneś użyć
json
. - Jeśli wykonujesz wiele operacji na wartości JSON w PostgreSQL lub używasz indeksowania na jakimś polu JSON, powinieneś użyć
jsonb
.