Was kann ich mit dem neuen JSON-Feld machen?

8

PostgreSQL 9.2 führte die json Feldtyp ein. Warum und wann sollte ich es verwenden? Welche Vorteile hat es gegenüber einem Textfeld?

Ich dachte, es wären neue Abfrageoptionen verfügbar, aber ich habe keine gesehen. Vermisse ich etwas

Jonathan Egerton
quelle

Antworten:

7

Postgres 9.2

Die neue Funktion bietet zwei Vorteile. Spalten vom Typjson überprüfen die Gültigkeit des Inhalts, sodass das, was in der Spalte enthalten ist, automatisch für JSON gültig ist und Sie eine Fehlermeldung erhalten, wenn Sie versuchen, etwas anderes darauf zu schreiben.
Und Sie haben grundlegende Funktionen zum Erstellen eines gültigen JSON im laufenden Betrieb aus Zeilen oder Arrays - ein sehr häufiger Anwendungsfall.

Ich zitiere Andrew Dunstan auf der Liste der pgsql-Hacker :

Irgendwann wird es möglicherweise einige json-Verarbeitungsfunktionen geben (im Gegensatz zu json-produzierenden), aber nicht in 9.2.

Ich habe dieses Zitat zuvor unter dieser verwandten Frage zu SO verwendet .

Postgres 9.3

.. bringt endlich eine Reihe von Funktionen und Operatoren. Lesen Sie die Handbuchseite für JSON-Funktionen .

Verwandte Antwort auf SO:

@Will Blog-Beitrag erstellen. Siehe Kommentar unten.

Postgres 9.4

Schauen Sie sich den neuen jsonbTyp mit einer Vielzahl neuer Funktionen an.

Vor allem der zerlegte binäre Speicher ermöglicht einen kleineren Speicher auf der Festplatte und einen Gleichheitsoperator für jsonb(im Gegensatz zu json), der eine Reihe zusätzlicher Operationen (wie DISTINCToder einen UNIQUEIndex) ermöglicht.

Für jsonund wurden weitere Funktionen hinzugefügt jsonb. json_to_record(), json_to_recordset()Usw. Mehr in der Release Notes.

Erwin Brandstetter
quelle
1
Sie können auch pl / v8js verwenden, um sie zu manipulieren, was Ihnen einige ziemlich großartige Funktionen bietet.
Chris Travers
1
Ja, aber wenn Sie eine gehostete Postgres-Instanz (wie Heroku) verwenden, ist PLV8 wahrscheinlich keine Option (sicherlich nicht auf Heroku). In diesem Fall ist der JSON-Datentyp, soweit ich sehen kann, in 9.2 von ziemlich begrenztem Wert. Es sieht so aus, als hätte 9.3 eine nette Unterstützung.
David S
1
Ein Blick auf die Updates in 9.3 michael.otacoo.com/postgresql-2/…
Will
2

Kurz gesagt, mit dem JSON-Datentyp (und der älteren HSTORE-Erweiterung und dem älteren Datentyp) können Sie PostgreSQL als "schemalosen" Datenspeicher verwenden (oder relationale und nicht relationale "schemalose" Daten kombinieren) auf einige der anderen NoSQL-Optionen zurückgreifen müssen (wie MongoDB). Sie erhalten sogar einige Dinge, die Sie mit MongoDB nicht tun können, wie gefilterte Indizierung, Ausdrucksindizierung usw. Der einzige Nachteil ist, dass PostgreSQL das Sharding nicht sofort unterstützt, wie es MongoDB tut ... aber ich Fragen Sie sich wirklich, wie oft Sharding wirklich benötigt wird. Mit einer gut konfigurierten PostgreSQL 9.3-Datenbank, ausreichenden O / S-Ressourcen und einigen einigermaßen gut durchdachten gefilterten Ausdrucksindizes sollten Sie problemlos schemalose Zeilenabrufe im Bereich von 0,25 Millisekunden erzielen können.

HTH, Dave Sisk

Dave Sisk
quelle
1

Grundsätzlich sehe ich hier drei Anwendungsfälle:

  1. Übergeben Sie komplexe Ergebnisse einfach an die Anwendung zurück
  2. Übergeben Sie komplexe Daten aus der Anwendung an die Datenbank
  3. Speichern Sie relativ Freiformdaten zur späteren Verarbeitung.

Der erste kann direkt von PostgreSQL aus durchgeführt werden, ohne dass Addons benötigt werden. Sie sollten in der Lage sein, etwas zu tun wie:

SELECT row_to_json(mt.id, mt.testval, array_agg(mt2))
  FROM my_table mt
  JOIN my_table2 mt2 ON mt.id = mt2.mt_id
 WHERE mt.id = 123;

Dies kann dann verwendet werden, um verschachtelte Arrays usw. in Ihrer Ausgabe zu erstellen und viele unordentliche Analyseprobleme auf der App-Seite zu vermeiden.

Die zweite Möglichkeit besteht darin, komplexe Daten zur Verarbeitung an die Datenbank zu übergeben. Derzeit gibt es keine integrierten Funktionen, um dies zu ermöglichen. Mit Addons wie pl / v8js können Sie Ihre Datenbank jedoch in Javascript programmieren und json als Austauschformat verwenden. Dies kann die Erstellung umfangreicherer Schnittstellen in Ihrer Datenbank ermöglichen. Da Sie Funktionsausgaben indizieren können, können Sie damit Indizes für Aspekte von JSON erstellen, die in Ihrer Datenbank gespeichert werden sollen.

Der dritte Bereich ist ein Bereich, den wir in LedgerSMB verwenden möchten. Die Idee ist, dass wir Systemintegratoren möglicherweise erlauben möchten, sehr einfache Informationen zusammen mit Kundenkonten zu speichern. Dies könnte dann in ein JSON-Feld gepackt werden, das gespeichert wird. Dies könnte nicht direkt von den Haupt-Apps abgefragt werden, aber wenn Leute dies mit pl / v8js hinzufügen wollten, könnte dies für einzelne Unternehmen erfolgen, die die Software verwenden.

Chris Travers
quelle