2016-11-27 77 views
0

假設我有三種類型的數據:A's,B's和C's。一個看起來是這樣的:在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。然而,在以後我需要到最近的三者組合成一個「喂」:

[{ 
    "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場一個表,還是應該有他們自己的表,並對他們做聯合查詢?爲了清楚起見,Feed只會共享字段。我也需要這種向前兼容 - 我知道一個事實,未來類型將有一個ID,一個created_at字段和一個作者,但除此之外,這是公平的遊戲。

謝謝!隨意詢問詳情。

編輯:啊,是的,我忘了提,我也想(在未來的某個點)就一個字段索引(如果行有它),這樣我可以搜索所有行「富「==」欄「。如果一行沒有foo,那不應該破壞這個。

回答

0

我選擇用一個表去以下幾個原因:

  1. JSONB是適合這種情況 - 我有幾個列我想要的一切,但其餘的是動態的。
  2. 我仍然可以對JSONB數據(特定於數據類型)進行索引。
  3. 我可以按一個索引降序排列一個索引,並將所有鍵都放在同一個表中。
  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

相關問題