从许多列与许多行(或表)的其他答案中,似乎列对于规范化数据更具性能。序列化数据怎么样?
我将存储许多正在进行的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列添加到具有数百万行的表中?在什么时候它倾向于支持许多行?
谢谢!
答案 0 :(得分:1)
如果仅在维护窗口(升级)期间引入新表单,则可能会使用第一种方法。
如果在正常操作期间可以引入新表格,则会导致问题:
ALTER TABLE
阻止并被所有并发数据修改语句阻止,这可能是个问题。
您需要成为表所有者或超级用户才能运行ALTER TABLE
,但出于安全考虑,最好是您的应用程序用户可以是除表所有者之外的其他人。
UPDATE
的数据量增加不是一个考虑因素,因为the documentation说:
在UPDATE操作期间,未更改字段的值通常保持原样;因此,如果没有任何外线值发生变化,那么具有行外值的行的更新不会产生任何TOAST成本。
我认为第二种设计更清晰,如果您拥有正确的索引,稍微复杂一点的查询将不会显得更加昂贵。