web-dev-qa-db-ja.com

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

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

新しいクエリオプションが利用できると思いましたが、まだ確認していません。何か不足していますか?

8

Postgres 9.2

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

私は引用します pgsql-hackersリストのAndrew Dunstan

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

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

Postgres 9.3

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

SOの関連回答:

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

Postgres 9.4

新しい機能のホストを備えた新しい jsonbtype を必ずチェックしてください。

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

さらに、jsonjsonbの両方に関数が追加されました。 json_to_record()json_to_recordset()など リリースノートの詳細

7

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

HTH、Dave Sisk

2
Dave Sisk

基本的に私はここに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の側面のインデックスを作成できることに注意してください。

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

1
Chris Travers