【问题标题】:What is the best way to organize a feed of different types in PostgreSQL?在 PostgreSQL 中组织不同类型的提要的最佳方式是什么?
【发布时间】:2017-04-11 01:13:08
【问题描述】:

假设我有三种类型的数据:A's、B's 和 C's。 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 字段,还是应该有自己的表并对它们进行联合查询?需要明确的是,提要只有共享字段。我还需要它是向前兼容的——我知道事实上未来的类型将有一个 ID、一个 created_at 字段和一个作者,但除此之外,这是公平的游戏。

谢谢!欢迎询问详情。

编辑:啊,是的,我忘了提到我还想(在将来的某个时间点)在字段上创建索引(如果行有它),以便我可以搜索所有“foo”==“bar”的行。如果一行没有 foo,那不应该打破这个。

【问题讨论】:

    标签: sql database postgresql schema


    【解决方案1】:

    我选择一张桌子有几个原因:

    1. JSONB 非常适合这种情况 - 我有几列我想要的所有内容,但其余的都是动态的。
    2. 我仍然可以对 JSONB 数据(特定于数据类型)进行索引。
    3. 我可以在一个索引中按列降序排列提要,并将所有键放在同一个表中。
    4. 我可以组合单独的相关表 (cmets)。
    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))
    

    【讨论】:

    • 我忘记包含type 列。它存在:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多