PostgreSQL właśnie wprowadził JSONB i jest już popularny w wiadomościach hakerów . Byłoby wspaniale, gdyby ktoś mógł wyjaśnić, czym różni się od Hstore i JSON wcześniej obecnych w PostgreSQL. Jakie są zalety i ograniczenia i kiedy ktoś powinien rozważyć jego użycie?
json
postgresql
nosql
postgresql-json
jsonb
Peeyush
źródło
źródło
Odpowiedzi:
Po pierwsze,
hstore
jest modułem contrib, który pozwala tylko przechowywać pary klucz => wartości, gdzie klucze i wartości mogą być tylkotext
s (jednak wartości mogą być również sqlNULL
s).Oba
json
&jsonb
pozwala przechowywać prawidłową wartość JSON (zdefiniowaną w specyfikacji ).F.ex. Są to ważne reprezentacje JSON:
null
,true
,[1,false,"string",{"foo":"bar"}]
,{"foo":"bar","baz":[null]}
-hstore
to tylko mały podzbiór w porównaniu do tego, co jest w stanie JSON (ale jeśli trzeba tylko ten podzbiór, jest w porządku).Jedyną różnicą między
json
&jsonb
jest ich przechowywanie:json
jest przechowywany w formacie zwykłego tekstu, natomiastjsonb
jest przechowywany w jakiejś reprezentacji binarnejIstnieją 3 główne konsekwencje tego:
jsonb
zwykle zajmuje więcej miejsca na dysku niżjson
(czasem nie)jsonb
kompilacja danych wejściowych zajmuje więcej czasu niżjson
json
operacje zajmują znacznie więcej czasu niżjsonb
(i parsowanie również musi być wykonywane za każdym razem, gdy wykonujesz jakąś operację ojson
wpisanej wartości)Gdy
jsonb
będzie dostępny w wersji stabilnej, pojawią się dwa główne przypadki użycia, w których można łatwo wybierać między nimi:json
.jsonb
.źródło
jsonb
tego nie obsługuje?UPDATE test SET data->'a' = 123 WHERE id = 1;
odCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
json
najsonb
to, czy ze względu na starszych kod zużywających swójjson
zależy od zamawiającego zjson
pola i nie można ich kolejność.text
przeciwieństwie dojson
: ten ostatni jest wyposażony w sprawdzanie poprawności JSON, więc po niepoprawnym JSON nie powiedzie się tylko przy wstawianiu, zamiast za każdym razem, gdy aplikacja go czyta (ponieważ otrzymuje niepoprawną reprezentację). Możesz również bezpiecznie przesyłać te ostatnie dojsonb
bazy danych.Peeyush:
Krótka odpowiedź brzmi:
Aby uzyskać dłuższą odpowiedź, musisz poczekać, aż zrobię pełny opis „HowTo” bliżej wersji 9.4.
źródło
Proste wyjaśnienie różnicy między json a jsonb ( oryginalny obraz autorstwa PostgresProfessional ):
Więcej w mowie wideo i prezentacji slajdów przez programistów jsonb. Wprowadzili także JsQuery , pg.extension zapewnia potężny język zapytań jsonb
źródło
hstore
jest bardziej typem „szerokiej kolumny”, jest to płaski (nie zagnieżdżony) słownik par klucz-wartość, zawsze przechowywany w rozsądnie wydajnym formacie binarnym (tablica skrótów, stąd nazwa).json
przechowuje dokumenty JSON jako tekst, wykonując walidację, gdy dokumenty są przechowywane, i analizując je w razie potrzeby (np. uzyskując dostęp do poszczególnych pól); powinien obsługiwać całą specyfikację JSON. Ponieważ cały tekst JSON jest przechowywany, jego formatowanie zostaje zachowane.jsonb
przyjmuje skróty ze względu na wydajność: dane JSON są analizowane na wejściu i przechowywane w formacie binarnym, kolejność kluczy w słownikach nie jest utrzymywana, a klucze nie są duplikatami. Dostęp do poszczególnych elementów w polu JSONB jest szybki, ponieważ nie wymaga ciągłego analizowania tekstu JSON. Na wyjściu dane JSON są odtwarzane i formatowanie początkowe jest tracone.IMO nie ma istotnego powodu, aby nie używać,
jsonb
gdy jest dostępny, jeśli pracujesz z danymi do odczytu maszynowego.źródło
JSONB to „lepsza” wersja JSON.
Spójrzmy na przykład:
Ogólnie rzecz biorąc, należy preferować JSONB, chyba że istnieją specjalne potrzeby, takie jak wcześniejsze założenia dotyczące porządkowania kluczy obiektowych.
źródło
Byłem dziś na pgopen, testy porównawcze są znacznie szybsze niż mongodb, uważam, że było około 500% szybsze dla wybranych. Prawie wszystko było szybsze przynajmniej o 200% w porównaniu z mongodbem, niż jednym wyjątkiem jest teraz aktualizacja, która wymaga całkowitego przepisania całej kolumny json, co mongodb radzi sobie lepiej.
Indeksowanie dżinu w jsonb brzmi niesamowicie.
Również postgres zachowa wewnętrznie typy jsonb i zasadniczo dopasuje to do typów takich jak numeryczne, tekstowe, logiczne itp.
Połączenia będą również możliwe przy użyciu jsonb
Dodaj PLv8 do procedur przechowywanych, a będzie to w zasadzie spełnienie marzeń programistów node.js.
Ponieważ jest przechowywany jako binarny plik jsonb, również usunie wszystkie białe znaki, zmieni kolejność właściwości i usunie duplikaty właściwości przy ostatnim wystąpieniu właściwości.
Poza indeksem podczas zapytania do kolumny jsonb w przeciwieństwie do kolumny json postgres nie musi faktycznie uruchamiać funkcji konwersji tekstu na json w każdym wierszu, co prawdopodobnie zaoszczędzi wiele czasu.
źródło
Jeśli chodzi o różnice między
json
ijsonb
typów danych, to warto wspomnieć o oficjalne wyjaśnienie:Źródło: https://www.postgresql.org/docs/current/datatype-json.html
źródło
Inną ważną różnicą, o której nie wspomniano w żadnej odpowiedzi powyżej, jest to, że nie ma operatora równości dla
json
typu, ale jest jeden dlajsonb
.Oznacza to, że nie można używać
DISTINCT
słów kluczowych przy wyborze tegojson
typu a i / lub inne pola z tabeli (można użyćDISTINCT ON
zamiast tego, ale nie zawsze jest to możliwe ze względu przypadkach takich jak ten ).źródło
O ile mogę powiedzieć,
hstore w obecnym kształcie (w Postgresql 9.3) nie pozwala na zagnieżdżanie innych obiektów i tablic jako wartości jego par klucz / wartość. jednak przyszła łatka hstore pozwoli na zagnieżdżanie. ta łatka nie będzie dostępna w wersji 9.4 i może nie zostać dołączona w najbliższym czasie.
json gdyż istnieje obecnie nie pozwala na zagnieżdżanie, ale jest oparty na tekście, a nie pozwala na indeksowanie, co to jest „wolna”
jsonb, który zostanie wydany z wersją 9.4, będzie miał bieżące możliwości zagnieżdżania json, a także indeksowanie GIN / GIST w hstore, więc będzie szybki
Osoby pracujące nad postgresql 9.4 wydają się mówić, że nowy, szybki typ jsonb spodoba się osobom, które wybrałyby użycie magazynu danych noSQL, takiego jak MongoDB, ale mogą teraz połączyć relacyjną bazę danych z nieustrukturyzowanymi danymi z możliwością zapytania pod jednym dachem
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
Benchmarki postgresql 9.4 jsonb wydają się być na równi lub w niektórych przypadkach szybsze niż MongoDB
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
źródło