PostgreSQL多jsonb列vs多行

PostgreSQL多jsonb列vs多行,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,从其他关于多列和多行(或表)的答案来看,对于规范化数据,列的性能似乎更高。序列化数据呢 我将存储许多正在进行的web表单,即尚未验证的表单,只是用户到目前为止拥有的一个转储,以便他们可以在另一个会话中继续。表单将被序列化为json并存储在jsonb列中。目前有十种形式,但(许多)更多的形式将在未来添加 是否最好有一个带有用户id的列,每个表单有一个列: CREATE TABLE "forms" ( "user_id" uuid NOT NULL, "form_a" jsonb,

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

我将存储许多正在进行的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列?在哪一点上倾向于多行


谢谢

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

如果在正常运行期间可以引入新表单,则会导致问题:

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

  • 要运行
    altertable
    ,您需要是表所有者或超级用户,但出于安全原因,如果您的应用程序用户可以是其他人而不是表所有者,则更好

增加
更新的数据量
不是一个考虑因素,因为如下所述:

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

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