新しいjsonフィールドで何ができますか?


8

PostgreSQL 9.2ではjsonフィールドタイプが導入されました。なぜ、いつ使用すべきですか?テキストフィールドに比べてどのような利点がありますか?

利用できる新しいクエリオプションがあると思ったが、私は何も見たことがない。何か不足していますか?

回答:


7

Postgres 9.2

新機能の利点は2つあります。タイプのjson列は、その内容の有効性を検証するため、列の内容は自動的に有効なJSONになり、何か他のものを書き込もうとするとエラーが発生します。
そして、あなたは行または配列からオンザフライで有効なJSONを作成するための基本的な関数を持っています-これは非常に一般的なユースケースです。

はpgsql-hackersリストでAndrew Dunstanを引用しています:

いくつかの段階で、jsonを生成するのではなく、jsonを処理する関数がいくつか存在する可能性がありますが、9.2にはありません。

私は以前、SOに関するこの関連質問の下でその引用を使用しました。

Postgres 9.3

..最後に、いくつかの関数と演算子をもたらします。JSON関数のマニュアルページを確認してください

SOの関連回答:

@ブログ投稿を掲載します。以下のコメントを参照してください。

Postgres 9.4

多くの新機能を備えた新しいjsonbタイプを必ずチェックしてください。

何よりも、分解されたバイナリストレージでは、ディスク上のストレージが小さくなり、jsonb(とは異なりjson)の等価演算子が可能になるため、(DISTINCTUNIQUEインデックスなどの)追加の操作が可能になります。

しかし、より多くの機能は、両方のために追加されているjsonjsonbjson_to_record()json_to_recordset()などリリースノートでもっと。


1
また、pl / v8jsを使用してそれらを操作することもできるので、かなり素晴らしい機能が得られます。
クリストラバース、

1
そうですが、ホストされているPostgresインスタンス(Herokuなど)を使用している場合、PLV8はおそらくオプションではありません(確かにHerokuにはありません)。その場合、私が見ることができるものから、JSONデータ型は9.2ではかなり制限された値です。9.3は素晴らしいサポートをしているようです。
David S

1
9.3に来て最新情報を見michael.otacoo.com/postgresql-2/...
ウィル

2

簡単に言うと、JSONデータ型(および古いHSTORE拡張とデータ型も)を使用すると、PostgreSQLを「スキーマレス」データストアとして(またはリレーショナルデータと非リレーショナル「スキーマレス」データを組み合わせて)使用できます。他のいくつかのNoSQLオプション(MongoDBなど)に頼る必要がある。フィルターされたインデックス付け、式のインデックス付けなど、MongoDBで実行できないこともいくつか得られます。唯一の欠点は、PostgreSQLが、MongoDBのように標準でシャーディングをサポートしていないことです...しかし、私はシャーディングがどれほど頻繁に本当に必要かを本当に質問します。適切に構成されたPostgreSQL 9.3データベース、十分なO / Sリソース、およびある程度よく考え抜かれたフィルター処理された式インデックスがあれば、0.25ミリ秒の範囲でスキーマなしの行の取得を簡単に実現できます。

HTH、Dave Sisk


1

基本的に私はここに3つのユースケースを見ます:

  1. 複雑な結果をアプリケーションに簡単に戻す
  2. アプリケーションからデータベースに複雑なデータを渡す
  3. 後で処理するために比較的自由形式のデータを保存します。

最初のものは、アドオンを必要とせずにPostgreSQLから直接実行できます。あなたは次のようなことができるはずです:

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;

これを使用して、出力にネストされた配列などを作成し、アプリ側での多くの乱雑な解析問題を回避できます。

2つ目は、処理のために複雑なデータをデータベースに渡すことです。現在、これを容易にする組み込み関数はありませんが、pl / v8jsなどのアドオンを使用すると、Javascriptでデータベースをプログラムし、jsonを交換形式として使用できます。これにより、データベース内に豊富なインターフェイスを作成できます。関数の出力にインデックスを付けることができるため、これを使用してJSONの側面のインデックスを作成し、dbに保存することができます。

3つ目は、LedgerSMBで使用する予定の領域の1つです。システムインテグレータが顧客のアカウントと共に非常に単純な情報を保存できるようにしたいという考えです。これは、格納されるJSONフィールドにパックできます。これはメインアプリから直接照会することはできませんが、pl / v8jsを使用してこれを追加したい場合は、ソフトウェアを使用する個々のビジネスでこれを実行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.