PostgreSQLはJSONBを導入したばかりで、ハッカーニュースですでにトレンドになっています。誰かが以前にPostgreSQLに存在していたHstoreやJSONとどのように異なるのかを誰かが説明できたら素晴らしいと思います。その利点と制限は何ですか?いつ誰かがそれを使用することを検討すべきですか?
PostgreSQLはJSONBを導入したばかりで、ハッカーニュースですでにトレンドになっています。誰かが以前にPostgreSQLに存在していたHstoreやJSONとどのように異なるのかを誰かが説明できたら素晴らしいと思います。その利点と制限は何ですか?いつ誰かがそれを使用することを検討すべきですか?
回答:
まず、hstore
contribモジュールです。これは、キー=>値のペアのみを格納できるようにします。キーと値はtext
s のみです(ただし、値はsql NULL
sでもかまいません)。
json
&の両方でjsonb
、有効なJSON 値(specで定義されている)を保存できます。
F.ex. これらは有効なJSON表現である:null
、true
、[1,false,"string",{"foo":"bar"}]
、{"foo":"bar","baz":[null]}
- hstore
JSONが可能であるものと比較ほんの少しのサブセットである(ただし、このサブセットのみが必要な場合は、それの罰金)。
json
&の唯一の違いjsonb
は、ストレージです。
json
プレーンテキスト形式で保存されますが、jsonb
バイナリ表現で保存されますこれには3つの大きな影響があります。
jsonb
通常、json
(場合によっては)よりも多くのディスク領域を格納するjsonb
入力表現から構築するよりも時間がかかります json
json
操作は、よりもかなり時間がかかりますjsonb
(また、json
型付きの値で操作を行うたびに解析も実行する必要があります)ときにjsonb
安定したリリースで利用できるようになり、あなたは簡単にそれらの間で選択することができたときに、二つの主要なユースケースがあるでしょう。
json
。jsonb
。jsonb
これをサポートしないのですか?UPDATE test SET data->'a' = 123 WHERE id = 1;
からCREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
json
以上は、jsonb
レガシー上の理由から、あなたのコードは、あなたが消費している場合でjson
の順序に依存しているjson
フィールドと、彼らは並べ替えることができません。
text
対json
:後者はJSONの検証が付属していますので、無効なJSONすると、それだけで(それが無効な表現を取得するため)代わりに毎回のアプリケーションがそれを読み込み、挿入時に失敗します。また、後者をjsonb
データベース内に安全にキャストできます。
jsonとjsonbの違いの簡単な説明(PostgresProfessionalによる元の画像):
SELECT '{"c":0, "a":2,"a":1}'::json, '{"c":0, "a":2,"a":1}'::jsonb;
json | jsonb
------------------------+---------------------
{"c":0, "a":2,"a":1} | {"a": 1, "c": 0}
(1 row)
jsonb開発者によるスピーチビデオとスライドショーのプレゼンテーションの詳細。また、彼らはJsQueryを導入しました、pg.extensionは強力なjsonbクエリ言語を提供します
hstore
これは「ワイドカラム」のストレージタイプで、キーと値のペアのフラットな(ネストされていない)辞書であり、常に適度に効率的なバイナリ形式(ハッシュテーブル、つまり名前)で保存されます。json
JSONドキュメントをテキストとして保存し、ドキュメントの保存時に検証を実行し、必要に応じて出力で解析します(つまり、個々のフィールドにアクセスします)。JSON仕様全体をサポートする必要があります。JSONテキスト全体が格納されるため、そのフォーマットは保持されます。jsonb
パフォーマンス上の理由でショートカットを使用します。JSONデータは入力で解析され、バイナリ形式で保存されます。辞書のキーの順序は維持されず、どちらも重複キーではありません。JSONBフィールドの個々の要素へのアクセスは、JSONテキストを常に解析する必要がないため、高速です。出力では、JSONデータが再構築され、初期のフォーマットが失われます。IMO、機械可読データで作業している場合は、使用可能になっても使用しない大きな理由はありませんjsonb
。
JSONBはJSONの「より良い」バージョンです。
例を見てみましょう:
SELECT '{"c":0, "a":2,"a":1}'::json, '{"c":0, "a":2,"a":1}'::jsonb;
json | jsonb
------------------------+---------------------
{"c":0, "a":2,"a":1} | {"a": 1, "c": 0}
(1 row)
一般に、オブジェクトキーの順序付けに関するレガシー前提などの特別なニーズがない限り、JSONBを優先する必要があります。
私は今日pgopenにいましたが、ベンチマークはmongodbよりもはるかに高速です。selectの場合は約500%高速だったと思います。mongodbと比較すると、ほとんどすべてが少なくとも200%高速でしたが、現在の1つの例外は、mongodbがより適切に処理するjson列全体を完全に書き換える必要がある更新です。
jsonbでのジンのインデックス作成はすばらしいですね。
また、postgresはjsonbのタイプを内部で永続化し、基本的にこれを数値、テキスト、ブールなどのタイプと一致させます。
jsonbを使用して結合することもできます
ストアドプロシージャにPLv8を追加します。これは基本的に、node.js開発者にとって夢の実現です。
バイナリjsonbとして保存されているため、すべての空白が削除され、プロパティの順序が変更され、最後に出現したプロパティを使用して重複するプロパティが削除されます。
jsonカラムに対してクエリを実行するときのインデックスは、jsonカラムとは対照的に、postgresは実際に機能を実行してすべての行でテキストをjsonに変換する必要がないため、単独でかなりの時間を節約できます。
json
とjsonb
データ型の違いについては、公式の説明に言及する価値があります。
PostgreSQLはJSONデータを格納するための2つのタイプが用意されています
json
とjsonb
。これらのデータ型に対して効率的なクエリメカニズムを実装するために、PostgreSQLはセクション8.14.6で説明されているjsonpathデータ型も提供しています。データ型は、入力として値のほぼ同一のセットを受け入れます。主な実用上の違いは効率の1つです。 データ型は、処理機能を実行するたびに再解析する必要があり、入力されたテキストの正確なコピーを格納します。ながら全く再解析が必要とされないので、データは、大幅に高速化プロセスに起因する追加の変換のオーバーヘッドに入力することがわずかに遅くなり分解バイナリ形式で格納されるが。はインデックス作成もサポートします。これは大きな利点になります。
json
jsonb
json
jsonb
jsonb
この
json
型は入力テキストの正確なコピーを格納するため、トークン間の意味的に重要ではない空白と、JSONオブジェクト内のキーの順序が保持されます。また、値内のJSONオブジェクトに同じキーが複数含まれている場合、すべてのキーと値のペアが保持されます。(処理関数は最後の値を有効な値と見なします。)対照的に、jsonb
空白は保持されず、オブジェクトキーの順序は保持されず、重複するオブジェクトキーは保持されません。入力で重複するキーが指定されている場合、最後の値のみが保持されます。一般に、
jsonb
オブジェクトキーの順序に関するレガシーな前提など、特別なニーズがない限り、ほとんどのアプリケーションはJSONデータをとして保存することを優先する 必要があります。PostgreSQLでは、データベースごとに1つの文字セットエンコーディングしか使用できません。したがって、データベースのエンコードがUTF8でない限り、JSONタイプをJSON仕様に厳密に準拠させることはできません。データベースのエンコーディングで表現できない文字を直接含めようとすると失敗します。逆に、データベースエンコーディングでは表現できるがUTF8では表現できない文字は許可されます。
出典:https : //www.postgresql.org/docs/current/datatype-json.html
私の知る限り、
現在(Postgresql 9.3で)存在するhstoreでは、キーと値のペアの値として他のオブジェクトや配列をネストすることはできません。ただし、将来のhstoreパッチではネストが可能になる予定です。このパッチは9.4リリースには含まれず、まもなく含まれる可能性があります。
jsonは現在存在しているため、ネストが可能ですが、テキストベースであり、インデックス作成ができないため、「遅い」
9.4でリリースされるjsonbには、jsonの現在のネスト機能と、hstoreのGIN / GISTインデックスが含まれるため、高速になります。
Postgresql 9.4に取り組んでいる人々は、新しい高速jsonbタイプはMongoDBのようなnoSQLデータストアを使用することを選択したが、リレーショナルデータベースをクエリ可能な非構造化データと1つの屋根の下で組み合わせることができるようになると言っているようです。
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
postgresql 9.4 jsonbのベンチマークは、MongoDBと同等か、場合によってはMongoDBよりも高速に見える
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb