2016-11-27 60 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

相关问题