postgresql 同一张表里多个字段都是 json 或 jsonb 的设计合理吗

2018-10-30 15:34:34 +08:00
 imherer

假如有一张表有如下字段: c1,c2,c3 这 3 个字段,其中 c3 类型为 json,假如 c3 里只有部分 key 会频繁的更新,但我看更新的时候好像必须得 update 整个 c3 字段,我是不是可以把 c3 里经常更新的 key 再拆为多个 column,单独更新他们,但是不知道同一张表里 json 字段太多了会不会有什么性能上的问题

主要是考虑性能方面的问题,这种设计有没有什么问题

2692 次点击
所在节点    PostgreSQL
12 条回复
xyjincan
2018-10-30 16:37:13 +08:00
m
lorazepam
2018-10-30 17:20:28 +08:00
```
jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false)

[{"f1":[2,3,4],"f2":null},2,null,3]
```
怎么会 update 整个字段?
imherer
2018-10-30 17:43:17 +08:00
@lorazepam 刚接触 postgresql,请教下
````
{
"guid": "9c36adc1-7fb5-4d5b-83b4-90356a46061a",
"name": "Angela Barton",
"is_active": true,
"company": "Magnafone",
"address": "178 Howard Place, Gulf, Washington, 702",
"registered": "2009-11-07T08:53:22 +08:00",
"latitude": 19.793713,
"longitude": 86.513373,
"tags": [
"enim",
"aliquip",
"qui"
]}
````
假如这一的 json,我只更新 tags 的话 sql 应该怎么写呢?条件是 guid
EchoUtopia
2018-10-30 17:52:04 +08:00
@lorazepam jsonb_set 完了不是还要赋值回去么?
imherer
2018-10-30 18:04:55 +08:00
@EchoUtopia
@lorazepam
好像是啊,我看了文档里 jsonb_set 只是改变当前 json 的值,我是要把这个改变更新到库里去
只能整个字段更新吧好像?
xyjincan
2018-10-30 18:13:22 +08:00
把变动少的,不变的属性拿出来
n2ex2
2018-10-30 18:17:41 +08:00
肯定不是更新整个字段,不然就不需要 json 类型,用字符串就完了。
n2ex2
2018-10-30 18:18:54 +08:00
json 操作以前看过有些复杂,如果你的 json 不长的话其实可以不用。
imherer
2018-10-31 09:27:57 +08:00
@xyjincan 嗯,我也是想按更新频繁度拆分字段。 就是不知道一张表里 json 类型的字段太多会不会有什么性能上的问题
imherer
2018-10-31 09:29:47 +08:00
@n2ex2 那你倒是说说部分更新怎么实现啊?
注意是更新入库,不是在 RAM 里的操作
n2ex2
2018-10-31 10:36:36 +08:00
reus
2018-11-19 17:14:33 +08:00
pg 更新一行,是一整行创建一个 tuple 的,所以没有必要分开。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/502594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX