PostgreSQL 许多 jsonb 列与许多行

PostgreSQL many jsonb columns vs many rows

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

我将存储许多正在进行的 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 列的一行中的列呢?或向具有数百万行的 table 添加新的 jsonb 列?它在什么时候倾向于支持多行?

谢谢!

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

如果在正常运行的时候引入新的表单,那就会出问题:

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

  • 您需要是 table 所有者或 运行 ALTER TABLE 的超级用户,但出于安全原因,您的应用程序用户最好是某人除了 table 所有者。

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

During an UPDATE operation, values of unchanged fields are normally preserved as-is; so an UPDATE of a row with out-of-line values incurs no TOAST costs if none of the out-of-line values change.

我认为第二种设计更简洁,如果您有正确的索引,稍微复杂的查询不会明显更昂贵。