选择什么数据类型:json、jsonb还是text?

49

我想存储一个大的Json哈希表(或内容,你可以随意称呼它),“大”指的是1000个键值对以上。我不想在这个Json字段上进行任何搜索,只想从数据库中检索出它并传递给JavaScript进行解析和构建可视化结果。

在PostgreSQL中有一个json类型和jsonb类型(也许我也可以使用text字段来存储json),我只想为此目的做出正确的选择,所以我想请有经验的人提供一些建议。

1个回答

69
假设你所说的是实际严格的JSON(不包含未引用键等怪癖)... jsontext相比并没有太大区别,除了验证JSON外,它几乎没什么其他操作。
jsonb则完全不同,它是一个拥有自己内部格式的完整数据结构,在搜索时有更多的操作可用。例如,json没有适用的=(相等运算符),而jsonb有。(text也有,尽管语义不同。)
虽然更容易建索引,但是在读写过程中必须进行转换。
鉴于此,在这里jsonb看起来不是明智的选择。
所以只剩下一个决定要做:
您想确保数据库在列中只包含有效的JSON值吗?在数据库层面上?还是信任该数据库的每个客户端(通常是服务器应用程序)只提供有效数据? json无论哪种方式都是相对安全的选择。使用text可以理论上通过消除验证来稍微提高性能,但只有通过基准测试才能得到具体数字。但它没有防止非JSON值的保障,客户端中的意外错误可能会被忽略。负责任地进行测试!

1
我有一个按钮,当用户点击它时,它会通过JavaScript生成JSON哈希,然后通过Ajax发送到数据库。我不认为用户可以在这里修改任何东西,但即使他这样做了,也只会影响他自己的账户 :) - medBouzid
3
这是我发现的另一个有用的信息来源,如果有人感兴趣:https://dev59.com/TmEh5IYBdhLWcg3wPRSq - medBouzid
鉴于答案的内容,不清楚为什么 jsonb 不是首选方法。它的优点已经提到了:它可以进行相等性搜索。但是没有描述任何负面影响。 - WestCoastProjects
@WestCoastProjects "需要在读写过程中反复转换" 是其中之一。但除此之外,通常情况下 jsonb 是一个不错的选择,正如 PostgreSQL 的文档(由 @Зелёный 提供引用)所说 - 它提供了更灵活的索引功能,即使代价是失去一些 JSON 的晦涩特性,比如支持重复对象键,这是一个相当罕见和晦涩的例子,直接淘汰了 jsonb - D-side
2
@WestCoastProjects 是真的。我会把那种怪癖归类为支持重复键的同一联盟。RFC 7159提出了一个有效的观点,即依赖JSON对象字段的顺序会损害互操作性。jsonb恰好展示了这一点。 - D-side
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接