UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【PostgreSQL】json型とjsonb型

PostgreSQLJSONデータ型にはjson型とjsonb型という2種類のデータ型があることを知ったので違いを調べてみた

www.postgresql.jp 上のドキュメントを引用してまとめる

  • 現実的に主要な違いは効率
  • jsonデータ型は入力テキストの正確なコピーで格納し、処理関数を実行するたびに再解析する必要がある
    • 入力値のコピーを格納しているので、意味的に重要でないトークン間の空白だけでなく、JSONオブジェクト内のキーの順序も維持する
    • JSONオブジェクト内に同じキーと値が複数含まれていてもすべてのキー/値のペアが保持される
  • jsonbデータ型は分解されたバイナリ形式で格納される
    • 空白を保持しない
    • オブジェクトキーの順序を保持せず、重複したオブジェクトキーを保持しない
    • jsonbデータ型は格納するときには変換のオーバーヘッドのため少し遅くなるが、処理するときには、全く再解析が必要とされないので大幅に高速化される
    • jsonbデータ型はインデックスをサポートしている

一般的に、ほとんどのアプリケーションではJSONデータ型としてjsonb型のほうが望ましいとのこと

JSONがjsonb型に変換されるときの注意事項

JSONがjsonb型に変換されるとき、プリミティブ型はPostgreSQLのネイティブな型に変換される

その際にマイナーな制約があるので注意が必要

たとえば、PostgreSQLのnumeric型の範囲外の数を拒否するなど、RFC 7159で許可されているがPostgreSQLで交換フォーマットとしてJSONを使用する場合は、数値精度を失う危険性がある