web-dev-qa-db-ja.com

Postgres jsonbと複合型のパフォーマンスの違い

同じ構造のjsonbカラムと複合タイプのカラムを選択する際に考慮すべきことは何ですか?

たとえば、Postgresのドキュメントで使用されているような列について考えてみます。

CREATE TYPE inventory_item AS (
name            text,
supplier_id     integer,
price           numeric
);

このアプローチと、この構造をミラーリングするjsonbカラムとの間のトレードオフは何ですか?

たとえば、複合型ではすべてのレコードのキー名を格納する必要がないのではないかと思いますが、jsonb型では必要です。

3
Metropolis

パフォーマンスの問題ではなく、

  • 複合型は強く型付けされているため、その形状を定義する必要があります。
  • JSONは弱く型付けされています。

さらに、JSONにはユースケースがありますが、複合型ではほとんど決して使用したくないので、ほとんどの場合、それらを独自の関係に正規化する方が適切です。ただし、例外が1つあります。一連のデータの周りにライブラリ全体を作成する場合、複合型を使用すると、すべてがより良くなります。たとえば、PostGISの stdaddr はそのような例の1つです。そのタイプは物理アドレスを表し、複数のものがそのタイプを取ることができます(PostGISジオコーダーなど)。

だからできる

CREATE TABLE foo ( foo_id int, address postgis.stdaddr );

これで ジオコーディングされた情報を比較的簡単に取得でき、15ではなく1つの値を渡すだけです です。

4
Evan Carroll

複合型の使用長所

  • ディスク容量が少ない
  • 選択/挿入/更新の高速化

複合型の短所の使用

  • 構造化されています(つまり、柔軟ではありません)。その場でフィールドを構成することはできません。
  • より長いコーディング時間(特にORMを使用する場合)

別のテーブルを使用している構造化データを保存するためのオプションがもう1つあります:)。 2つのテーブルを作成して、自分でテストできます。

1
Sahap Asci