【问题标题】:PostgreSQL many jsonb columns vs many rowsPostgreSQL 许多 jsonb 列与许多行
【发布时间】:2017-06-10 00:12:08
【问题描述】:

从多列与多行(或表)的其他答案看来,列对于规范化数据的性能更高。序列化数据呢?

我将存储许多正在进行的 Web 表单,即尚未验证的只是用户目前拥有的内容的转储,以便他们可以在另一个会话中继续。表单将被序列化为 json 并存储在 jsonb 列中。目前有十种形式,但将来会增加(更多)。

最好有一列有用户ID,每个表单都有一列:

CREATE TABLE "forms" (
    "user_id" uuid NOT NULL,
    "form_a" jsonb,
    "form_b" jsonb,
    "form_c" jsonb,
    ...
)

或包含用户 uuid、表单 id 和表单 json 列的多行:

CREATE TABLE "forms" (
    "user_id" uuid NOT NULL,
    "form_id" uuid NOT NULL,
    "form_json" jsonb NOT NULL
)

我确信只查询一行会更快,但是如何更新具有许多 jsonb 列的行中的列呢?或将新的 jsonb 列添加到具有数百万行的表中?它在什么时候倾向于支持多行?

谢谢!

【问题讨论】:

    标签: sql postgresql jsonb


    【解决方案1】:

    如果仅在维护窗口(升级)期间引入新表单,您可能会使用第一种方法。

    如果在正常操作过程中可以引入新的表格,那将导致问题:

    • ALTER TABLE 阻塞并被所有并发数据修改语句阻塞,这可能是个问题。

    • 您需要是表所有者或超级用户才能运行 ALTER TABLE,但出于安全原因,您的应用程序用户最好是表所有者以外的其他人。

    UPDATE 增加的数据量不是考虑因素,因为正如the documentation 所说:

    在 UPDATE 操作期间,未更改字段的值通常保持原样;因此,如果没有任何外线值发生变化,则更新具有外线值的行不会产生 TOAST 成本。

    我认为第二种设计更简洁,如果你有正确的索引,稍微复杂一点的查询不会显着增加开销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2012-03-14
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多