PostgreSQL hat gerade JSONB eingeführt und es ist bereits ein Trend bei Hacker-News . Es wäre großartig, wenn jemand erklären könnte, wie es sich von Hstore und JSON unterscheidet, die zuvor in PostgreSQL vorhanden waren. Was sind seine Vor- und Nachteile und wann sollte jemand darüber nachdenken, es zu verwenden?
json
postgresql
nosql
postgresql-json
jsonb
Peeyush
quelle
quelle
Antworten:
Erstens
hstore
handelt es sich um ein Contrib-Modul, mit dem Sie nur Schlüssel => Wertepaare speichern können, wobei Schlüssel und Werte nurtext
s sein können (Werte können jedoch auch SQLsNULL
sein).Mit Both
json
&jsonb
können Sie einen gültigen JSON- Wert (in der Spezifikation definiert ) speichern .F.ex. diese sind gültig JSON Darstellungen:
null
,true
,[1,false,"string",{"foo":"bar"}]
,{"foo":"bar","baz":[null]}
-hstore
ist nur ein kleiner Teilmenge im Vergleich zu dem, was JSON ist in der Lage (aber wenn Sie benötigen nur diese Teilmenge, es ist in Ordnung).Der einzige Unterschied zwischen
json
&jsonb
ist ihre Speicherung:json
wird im Klartextformat gespeichert, währendjsonb
wird in einer binären Darstellung gespeichertDies hat drei Hauptfolgen:
jsonb
Zum Speichern wird normalerweise mehr Speicherplatz benötigt alsjson
(manchmal nicht)jsonb
Das Erstellen der Eingabedarstellung dauert länger alsjson
json
Operationen benötigen erheblich mehr Zeit alsjsonb
(& Parsing muss auch jedes Mal durchgeführt werden, wenn Sie eine Operation mit einemjson
eingegebenen Wert ausführen )Wann
jsonb
mit einer stabilen Version verfügbar sein wird, gibt es zwei Hauptanwendungsfälle, bei denen Sie leicht zwischen ihnen wählen können:json
.jsonb
.quelle
jsonb
dies nicht unterstützt?UPDATE test SET data->'a' = 123 WHERE id = 1;
vonCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
json
überjsonb
, wenn für Legacy - Gründe Code raubend Ihrejson
abhängig ist von der Reihenfolge derjson
Felder und sie können nicht neu angeordnet werden.text
vsjson
.: Letzteres wird mit JSON-Validierung geliefert. Bei ungültigem JSON schlägt dies also nur beim Einfügen fehl, anstatt jedes Mal, wenn Ihre Anwendung es liest (weil es eine ungültige Darstellung erhält). Sie können letzteres auch sicherjsonb
in die Datenbank umwandeln.Peeyush:
Die kurze Antwort lautet:
Für eine längere Antwort müssen Sie warten, bis ich eine vollständige "HowTo" -Beschreibung näher an der Version 9.4 gemacht habe.
quelle
Eine einfache Erklärung des Unterschieds zwischen json und jsonb ( Originalbild von PostgresProfessional ):
Mehr in Rede Video und Diashow - Präsentation von jsonb Entwicklern. Auch sie eingeführt JsQuery stellt pg.extension leistungsstarke jsonb Abfragesprache
quelle
hstore
ist eher ein "breitspaltiger" Speichertyp, es ist ein flaches (nicht verschachteltes) Wörterbuch von Schlüssel-Wert-Paaren, das immer in einem einigermaßen effizienten Binärformat (eine Hash-Tabelle, daher der Name) gespeichert ist.json
speichert JSON-Dokumente als Text, führt eine Validierung durch, wenn die Dokumente gespeichert sind, und analysiert sie bei Bedarf bei der Ausgabe (dh Zugriff auf einzelne Felder); Es sollte die gesamte JSON-Spezifikation unterstützen. Da der gesamte JSON-Text gespeichert ist, bleibt seine Formatierung erhalten.jsonb
Aus Leistungsgründen werden Verknüpfungen verwendet: JSON-Daten werden bei der Eingabe analysiert und im Binärformat gespeichert, Schlüsselreihenfolgen in Wörterbüchern werden nicht beibehalten und doppelte Schlüssel werden nicht verwendet. Der Zugriff auf einzelne Elemente im JSONB-Feld ist schnell, da der JSON-Text nicht ständig analysiert werden muss. Bei der Ausgabe werden JSON-Daten rekonstruiert und die anfängliche Formatierung geht verloren.IMO, gibt es keinen wesentlichen Grund für die nicht verwenden ,
jsonb
sobald es verfügbar ist, wenn Sie mit maschinenlesbaren Daten arbeiten.quelle
JSONB ist eine "bessere" Version von JSON.
Schauen wir uns ein Beispiel an:
Im Allgemeinen sollte man JSONB bevorzugen, es sei denn, es gibt spezielle Anforderungen, wie z. B. ältere Annahmen zur Reihenfolge der Objektschlüssel.
quelle
Ich war heute auf der pgopen. Benchmarks sind viel schneller als Mongodb. Ich glaube, sie waren für ausgewählte Personen um 500% schneller. Im Gegensatz zu Mongodb war so ziemlich alles mindestens um 200% schneller als eine Ausnahme. Derzeit ist ein Update ein Update, bei dem die gesamte JSON-Spalte komplett neu geschrieben werden muss, was Mongodb besser handhabt.
Die Gin-Indizierung auf jsonb klingt erstaunlich.
Auch Postgres werden intern Arten von Jsonb beibehalten und dies grundsätzlich mit Typen wie numerisch, Text, Booleschen Werten usw. abgleichen.
Joins sind auch mit jsonb möglich
Wenn Sie PLv8 für gespeicherte Prozeduren hinzufügen, wird dies für die Entwickler von node.js im Grunde ein wahr gewordener Traum.
Da es als binäres jsonb gespeichert ist, werden auch alle Leerzeichen entfernt, die Reihenfolge der Eigenschaften geändert und doppelte Eigenschaften mit dem letzten Vorkommen der Eigenschaft entfernt.
Abgesehen davon, dass der Index bei der Abfrage einer jsonb-Spalte im Gegensatz zu einer json-Spalte postgres nicht die Funktionalität ausführen muss, um den Text in jeder Zeile in json zu konvertieren, was wahrscheinlich allein viel Zeit spart.
quelle
In Bezug auf die Unterschiede zwischen
json
undjsonb
Datentypen ist die offizielle Erklärung zu erwähnen:Quelle: https://www.postgresql.org/docs/current/datatype-json.html
quelle
Soweit ich sagen kann,
Der derzeit vorhandene hstore (in Postgresql 9.3) ermöglicht nicht das Verschachteln anderer Objekte und Arrays als Werte seiner Schlüssel / Wert-Paare. Ein zukünftiger Hstore-Patch ermöglicht jedoch das Verschachteln. Dieser Patch wird nicht in der Version 9.4 enthalten sein und möglicherweise nicht in Kürze enthalten sein.
json, wie es derzeit existiert, erlaubt das Verschachteln, ist jedoch textbasiert und erlaubt keine Indizierung, daher ist es "langsam"
jsonb, das mit 9.4 veröffentlicht wird, verfügt über die aktuellen Verschachtelungsfunktionen von json sowie über die GIN / GIST-Indizierung von hstore, sodass es schnell geht
Leute, die an postgresql 9.4 arbeiten, scheinen zu sagen, dass der neue, schnelle jsonb-Typ Leute ansprechen wird, die sich für einen noSQL-Datenspeicher wie MongoDB entschieden hätten, jetzt aber eine relationale Datenbank mit abfragbaren unstrukturierten Daten unter einem Dach kombinieren können
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
Die Benchmarks von postgresql 9.4 jsonb scheinen mit MongoDB gleichzusetzen oder in einigen Fällen schneller zu sein
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
quelle
Ein weiterer wichtiger Unterschied, der in keiner Antwort oben erwähnt wurde, ist, dass es keinen Gleichheitsoperator für den
json
Typ gibt, aber einen fürjsonb
.Dies bedeutet , dass Sie nicht verwenden können
DISTINCT
Schlüsselwort , wenn diese Auswahljson
-Typ und / oder andere Felder aus einer Tabelle (können Sie verwendenDISTINCT ON
stattdessen, aber es ist nicht immer möglich , da die Fälle wie diesen ).quelle