インデックス付きJSONBとhstore


28

この段階では、可能な限り少ない仮定(Webアプリの実際の進化に関する)でデータベース設計を決定しようとしています。

JOINSが高価であることを理解するための最初のステップとして、多数の正規化された小さなテーブルではなく、少数のモノリシックテーブルを検討しています。2番目のポイントとして、hstoreと通常のテーブルとJSONB(GiSTインデックス付け)を使用することで混乱しています。

知っている(気軽に修正してください):

  1. 一般に、Postgresでは、hstoreは他のデータ型よりもパフォーマンスが良いことが知られています。FOSDEM PGDAYからのこのプレゼンテーションには、いくつかの興味深い統計があります(スライドの後半)。 https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf

  2. hstoreの利点は、高速インデックス(GiNまたはGiST)です。ただし、JSONBでは、GiNおよびGiSTインデックス付けをJSONデータに適用することもできます。

  3. 第2象限の専門家によるこのブログは、「この時点で、おそらくすべての新しいアプリケーションでhstoreの使用をjsonbに置き換える価値がある」と述べています(最後までスクロール):http ://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary -jsonhstore-dynamic-columns /

だから私は次のことを決定したいと思います:

  1. データの主要な(構造化された)部分の場合:いくつかのリレーショナルテーブル(多くの列を持つ比較的大きい)に入れるべきですか、それともhstoreを使用する多数のキー値ストアである必要がありますか?
  2. アドホック(ユーザー提供/非構造化)データの場合、JSONまたはhstoreのアドホックキー値ストア(メインリレーショナルテーブルのいずれかにキーが格納されている)に格納する必要がありますか?

7
結合は高価ではありません。誰があなたに言ったの?基本的に、リレーショナルデータベースの概念全体が(実用的な観点から)結合を中心に展開するため、これらの製品は結合に非常に優れています。通常の考え方は、適切に正規化された構造から開始し、パフォーマンスが読み取り側で実際に必要とする場合に、派手な非正規化などを行います。 JSON(B)およびhstore(およびEAV)は、構造が不明なデータに適しています。
dezso

6
@Yogeschそれらのリンクには、いくつかの興味深い矛盾するものが含まれています:)道徳的には、MySQLは結合が(悪い)ようであり、NoSQLの人々は実際の根拠なしにこの概念を一般化する傾向があります。一方、AaronとMaxはそのp-wordに敏感です-その幅広い使用法は、非ネイティブスピーカー(自分自身を含む)が間違った単語を喜んで使用する方法を示しています。
dezso

4
@Yogeschは現実的に、インターネット上に何かを「証明」する情報源があると確信しています。宗教テキストが残虐行為を正当化するために使用できるように(歴史を通して劇的に示されているように)。作業が少ないほどコストは低くなりますが、常にある程度のトレードオフがあります。
エリック

4
@Yogesch:結合を回避することは、データアクセスパターンを事前に知っている読み取り重視の操作にとって重要であるため、必要なすべてのデータを1行に安全に配置できます。ただし、これにより他の結合のコストが高くなる可能性があります。さまざまな質問に答えるために、さまざまな方法でデータに参加する必要がないと言うのは誰ですか?今、私たちは...リレーショナルデータモデリングの理論に単純に下降するつもりだ
クリス・

5
@Yogesch私の実践では、データベースのボトルネックはめったにRAMまたはCPUではありませんが、I / Oです。この方法では、冗長データの保存を避けることが重要です。クリスが言うように、データを常に一方向にしか見ない場合、これは価格に見合う価値があるかもしれません。そうでない場合は、かさばって非常に柔軟性のないデータの塊があります。
dezso

回答:


41

リレーショナルデータベースは、結合を中心に設計されており、結合を適切に行うために最適化されています。

正規化されたデザインを使用しない正当な理由がない限り、正規化されたデザインを使用してください。

jsonbそして、のようなものは、hstoreあなたがする場合に適していないことができ、このようなデータモデルが急激に変化し、ユーザが定義されているときのように、正規化されたデータモデルを使用しています。

リレーショナルモデルを作成できる場合は、リレーショナルモデルを作成します。あなたは、JSONなどを検討することができない場合場合あなたはJSON / jsonb / hstoreの間で選択しているあなたがいないの理由がない限り、一般的にjsonbを選択してください。

それが私のブログ投稿私が言ったことでありまさにこのトピックに対処しています。投稿全体をお読みください。引用した段落は、動的構造選択する場合はhstoreよりもjsonbを選択する必要があることを指摘していますが、ブログ投稿の残りの部分では、可能な場合にリレーショナルモデルを選択する理由について説明します。

そう。主要な構造化部分をリレーショナルでモデル化します。テーブルが非常に広く、多くの列がある場合、これはさらなる正規化が必要であることを示している可能性があります。参加を恐れないでください。ジョインを愛することを学ぶ。多くの小さなテーブルの結合は、多くの場合、大きな非正規化テーブルのクエリとメンテナンスよりも高速です。特定の場合に必要な場合にのみ、できれば実体化ビューを使用して非正規化してください...しかし、実際に具体的な問題を解決する必要があることがわかっているまで、非正規化しないでください。

自由形式で構造化されていないユーザー投稿データの場合は、jsonbを使用します。hstoreと同じように機能するはずですが、より柔軟で簡単に操作できます。

理解すべき関連事項の1つ:jsonbで使用されるようなGiSTインデックスとGINインデックスは、一般単純なbツリーインデックスよりもはるかに効率が悪いです。それらはより柔軟性がありますが、通常の列のBツリーインデックスはほとんどの場合、はるかに高速です。


クレイグに感謝します。今、私はより良い理解を持ち、何をすべきかを知っています。フォローアップの質問:私のようなもの格納していた場合好きフォロワーを(のためにpost_idとuser_idの、2つの列形式で好き)、それは二つの列、またはhstoreのでリレーショナル表を使用することが良いですか?(これを新しい質問にすることを気にしません)
ヨゲシュ

5
@Yogesch一貫した安定した形式の沼地標準のm:n結合テーブルのように聞こえます。質問は常に「この特定のケースでこれを通常のリレーショナルな方法で行うべきではない十分な理由があるのか」ということです。
クレイグリンガー

hstore非推奨です。を使用しjsonbます。
danger89

2
@ danger89実際には、正式に廃止されたわけではありませんが、jsonbを優先して使用する理由はないと思います。いずれにせよ...それは一種の見落としがあります。問題は、リレーショナルモデルを使用するか、構造化データ型を使用するかです。
クレイグリンガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.