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
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
Antworten:
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 .
.. 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.
Schauen Sie sich den neuen jsonb
Typ 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 DISTINCT
oder einen UNIQUE
Index) ermöglicht.
Für json
und wurden weitere Funktionen hinzugefügt jsonb
. json_to_record()
, json_to_recordset()
Usw. Mehr in der Release Notes.
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
Grundsätzlich sehe ich hier drei Anwendungsfälle:
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.