PostgreSQL 9.2ではjson
フィールドタイプが導入されました。なぜ、いつ使用すべきですか?テキストフィールドに比べてどのような利点がありますか?
利用できる新しいクエリオプションがあると思ったが、私は何も見たことがない。何か不足していますか?
PostgreSQL 9.2ではjson
フィールドタイプが導入されました。なぜ、いつ使用すべきですか?テキストフィールドに比べてどのような利点がありますか?
利用できる新しいクエリオプションがあると思ったが、私は何も見たことがない。何か不足していますか?
回答:
新機能の利点は2つあります。タイプのjson
列は、その内容の有効性を検証するため、列の内容は自動的に有効なJSONになり、何か他のものを書き込もうとするとエラーが発生します。
そして、あなたは行または配列からオンザフライで有効なJSONを作成するための基本的な関数を持っています-これは非常に一般的なユースケースです。
私はpgsql-hackersリストでAndrew Dunstanを引用しています:
いくつかの段階で、jsonを生成するのではなく、jsonを処理する関数がいくつか存在する可能性がありますが、9.2にはありません。
私は以前、SOに関するこの関連質問の下でその引用を使用しました。
..最後に、いくつかの関数と演算子をもたらします。JSON関数のマニュアルページを確認してください。
SOの関連回答:
@ブログ投稿を掲載します。以下のコメントを参照してください。
多くの新機能を備えた新しいjsonb
タイプを必ずチェックしてください。
何よりも、分解されたバイナリストレージでは、ディスク上のストレージが小さくなり、jsonb
(とは異なりjson
)の等価演算子が可能になるため、(DISTINCT
やUNIQUE
インデックスなどの)追加の操作が可能になります。
しかし、より多くの機能は、両方のために追加されているjson
とjsonb
。json_to_record()
、json_to_recordset()
などリリースノートでもっと。
簡単に言うと、JSONデータ型(および古いHSTORE拡張とデータ型も)を使用すると、PostgreSQLを「スキーマレス」データストアとして(またはリレーショナルデータと非リレーショナル「スキーマレス」データを組み合わせて)使用できます。他のいくつかのNoSQLオプション(MongoDBなど)に頼る必要がある。フィルターされたインデックス付け、式のインデックス付けなど、MongoDBで実行できないこともいくつか得られます。唯一の欠点は、PostgreSQLが、MongoDBのように標準でシャーディングをサポートしていないことです...しかし、私はシャーディングがどれほど頻繁に本当に必要かを本当に質問します。適切に構成されたPostgreSQL 9.3データベース、十分なO / Sリソース、およびある程度よく考え抜かれたフィルター処理された式インデックスがあれば、0.25ミリ秒の範囲でスキーマなしの行の取得を簡単に実現できます。
HTH、Dave Sisk
基本的に私はここに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を使用してこれを追加したい場合は、ソフトウェアを使用する個々のビジネスでこれを実行できます。