在PostgreSQL中组织不同类型的Feed的最佳方法是什么?

时间:2016-11-27 02:36:41

标签: sql database postgresql schema

假设我有三种类型的数据:ABC。 A看起来像这样:

{
    "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”==“bar”的行。如果一行没有foo,那不应该破坏它。

1 个答案:

答案 0 :(得分:0)

由于以下几个原因,我选择使用单张表:

  1. JSONB非常适合这种情况 - 我在所有内容上都有一些列,但其余的都是动态的。
  2. 我仍然可以在JSONB数据上创建索引(特定于数据类型)。
  3. 我可以在一个索引中按列的顺序排序,并让所有键都在同一个表中。
  4. 我可以组合单独的相关表格(评论)。
  5. 整体来说更有意义。
  6. 以下是表格说明:

                                              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))