这种情况用 jsonb 保存好还是用表保存好呢

2020-12-01 11:31:57 +08:00
 FightPig

一个表是 table1,另一个表是 table2, table1:

id:int
name: varchar

table2

id:int
table1_id:int
content: varchar

如有一条 table1 记录,可能下面有几千条 table2 记录,当 table1 表不停增加,我发现 table2 表数据最后能达到几亿条,然后如果把 table1 改成

talbe1: id: int name: varchar items: jsonb

比如这样保存, table1 中把关联保存成这样

items: [{content: "content1"}, {content: 'content2'}.....]

这样,如果 table1 有 100 万条,不用生成 table2 的 100 万*几千条,不知道这样行不行?这样 table2 不会出现几亿甚至几十亿条数据,主要我是担心这个上几亿速度会变很慢。

2823 次点击
所在节点    PostgreSQL
10 条回复
echowuhao
2020-12-01 11:47:30 +08:00
不可取。1. 肯定会更慢,取决于你查询的内容。
2. 仅 content 一个词,一亿条记录就增加了快 650M 的空间占用。

你可以弄个几万条记录测试一下,我只是猜想。
echowuhao
2020-12-01 11:50:25 +08:00
查了一下,jsonb 也有 size limit,which is 255 MB.

https://stackoverflow.com/questions/12632871/

如果内容比较多,不能用。
FightPig
2020-12-01 11:56:44 +08:00
@echowuhao 谢谢,上面说的有点错,现在 table1 这个表不停增长,大约后期有 100w 条多,一个 table1 最多关联 2000 多条 table2 数据吧,这样一算,table2 这数据量有点太大,如果保存成 jsonb,那这样也就只有 100w 多条 table1,感觉查询应该比查询 100w*2000 这样的数量好查询,主要是 table2 这个表不断膨胀,如果保存成 jsonb 形式的,没有 1 亿条了,只有 table1 的条数 100w 多吧。
echowuhao
2020-12-01 12:06:15 +08:00
你实际测一下。表虽然 row size 多了一点,但是 postgres 可以有更多信息优化,你堆到 jsonb 里面,postgres 能知道的信息更少,查询的时候就要麻烦了。

我个人没有做过那么大的表,所以只能理论说一下。
echowuhao
2020-12-01 12:08:54 +08:00
@FightPig 没有一亿条了,但是 content 字符出现的次数不是 table1 row size 而是 table 2 的。你之前只寸这个字符一次,就是列名,但是你存到 jsonb 里面不是一百万次,而是一亿次。只一亿次是凭空多出来的存储空间。
2kCS5c0b0ITXE5k2
2020-12-01 12:09:54 +08:00
先确定 table2 需不需要单独查询 如果不需要可以用 jsonb
json 存储起来占用的空间会比较大
sjzzz
2020-12-01 13:08:04 +08:00
这种最终还是要看 后续的业务逻辑 光分析表结构意义不大。
FightPig
2020-12-01 13:10:37 +08:00
@echowuhao 嗯,我单独插入 1 亿条试了下,在加了外键索引下,查询 还行,毕竟一条记录只关联 2000 多条 table2,
@emeab table2 要更新,比如要改下{content1: 'content1', content2: 'content2'}更新成{content1: 'content1111', content2: 'content2'},查询的话,只是要取出 这个 jsonb 的 key 成一个数组 ['content1','content2'] ,然后用这个数组去查另一张表里的数据 。
liprais
2020-12-01 13:11:38 +08:00
肯定分开啊,不然你 update 别的字段的时候 jsonb 也被读了一遍
FightPig
2020-12-03 14:53:45 +08:00
@liprais
@sjzzz 放弃 jsonb 了,在我这两天测试,加入 2000 项后, 查询表时慢的不行,google 看了下好像是 pg 的 jsonb 用了 TOAST,换成了 mongodb 了

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

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

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

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

© 2021 V2EX