2016-11-27 16 views
0

私は、データの種類が「A」、「B」、「C」の3種類あるとします。次のようになります。PostgreSQLでさまざまな種類のフィードを整理する最良の方法は何ですか?

{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "created_at": "2016-11-27 02:24:12.889637+00", 
    "author": "7d16389b-2d66-4c59-bb6a-87992a60d112", 
    "foo": "bar", 
    "baz": "zab", 
    "cat": "dog" 
} 

Bは次のようになります。

{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "created_at": "2016-11-27 02:24:12.889637+00", 
    "author": "7d16389b-2d66-4c59-bb6a-87992a60d112", 
    "foo": "bar", 
    "baz": "zab", 
    "nak": "kan" 
} 

そしてCは次のようになります。

{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "created_at": "2016-11-27 02:24:12.889637+00", 
    "author": "7d16389b-2d66-4c59-bb6a-87992a60d112", 
    "baz": "zab", 
    "cat": "dog" 
} 

あり、その分野での(小さめの)バリエーションがありますが、彼らが持っていますいくつかの一貫したフィールド(「メタデータ」とも言います)。これらはそれぞれ独自のデータ型を表します.Bは異なるフィールドを持つAではありません。しかし、後の時点で私は、「フィード」に3つのすべての最も最近のを結合する必要があります。

[{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "type": "A", 
}, 
{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "type": "B", 
}, 
{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "type": "C", 
}] 

が、私は彼らの共有の場とJSONBフィールドを持つ3つのすべてを表す単一のテーブルを作成する必要があり、または彼らがすべき独自のテーブルを持ち、そのテーブルに対してユニオンクエリーを実行しますか?明確にするために、フィードには共有フィールドしかありません。これも前方互換性が必要です。将来のタイプにはID、created_atフィールド、作成者がありますが、それ以外には公正なゲームだということを知っています。

ありがとうございます!お気軽に詳細をお尋ねください。

編集:ああ、はい、私は(いくつかの将来の時点で)私もしたいことは言う私はすべての行「のfooを検索することができますように(行がそれを持っている場合)、フィールドにインデックスを作るのを忘れて"=="バー "。行にfooがない場合は、これを破るべきではありません。

答えて

0

私はいくつかの理由のために、単一のテーブルに行くことを選択した:

  1. JSONBは、このような状況に最適です - 私はすべてのものにしたいいくつかの列を持っているが、残りは動的です。
  2. 私はまだJSONBデータ(データの種類に固有の)にインデックスを付けることができます。
  3. フィードを1つのインデックスで降順に並べ替えることができ、すべてのキーを同じテーブルに入れることができます。
  4. 私は別々の関連テーブル(コメント)を組み合わせることができます。
  5. 全体的にはより意味があります。ここで

テーブルの説明です:

          Table "public.feed" 
    Column |   Type   |       Modifiers       
------------+--------------------------+--------------------------------------------------------------- 
id   | uuid      | primary key unique not null 
created_at | timestamp with time zone | not null default now() 
created_by | uuid      | not null default '00000000-0000-0000-0000-000000000000'::uuid 
data  | jsonb     | 
Indexes: 
    "feed_pkey" PRIMARY KEY, btree (id) 
    "feed_created_at_index" btree (created_at DESC) 
    "feed_data_index" btree (data) 
    "text_index" gin (to_tsvector('english'::regconfig, data ->> 'text'::text)) 
+0

私は 'type'が列を含めるのを忘れていました。それが存在します :) – AniSkywalker

関連する問題