将 json 对象存储到 postgresql 中的数据类型是啥?

Posted

技术标签:

【中文标题】将 json 对象存储到 postgresql 中的数据类型是啥?【英文标题】:What is the datatype to store json object into postgresql?将 json 对象存储到 postgresql 中的数据类型是什么? 【发布时间】:2019-03-05 18:04:47 【问题描述】:

我对 postgresql 很陌生。

我想将下面的 json 对象存储到 postgresql 数据库中。


  "host": "xxx.xxx.xx.xx"
  "type": "OS"

你能告诉我我应该在 postgresql 中使用什么数据类型吗?提前致谢。

【问题讨论】:

【参考方案1】:

如果您的数据始终包含相同的简单结构,我认为没有任何理由将它们存储为 JSON。您应该考虑将其简单地存储在包含 hosttype 列的表中。

INSERT INTO table(my_host_column, my_type_column) VALUES
(my_json ->> 'host', my_json ->> 'type');

这使许多事情变得更加简单(搜索、更新……)。在您的情况下,Postgres 为 IP 地址列提供 inet 类型。这样的列可以为您的host 进行合理性检查,例如 (https://www.postgresql.org/docs/current/static/datatype-net-types.html)

您可以随时使用json_build_object('host', my_host_column, 'type', my_type_column) (https://www.postgresql.org/docs/current/static/functions-json.html) 重新创建 JSON


但是,如果您仍想按原样存储 JSON:

如果您不想对它做任何事情,请将其存储为text 类型(我绝对不推荐,因为您不知道未来会发生什么)。如果你想使用 Postgres 的 JSON 函数,你应该将其存储为 jsonjsonb 类型(https://www.postgresql.org/docs/current/static/datatype-json.html)。

jsonb 主要是节省空间(更多元数据)的开销,但在操作上通常要快得多。

进一步阅读

Explanation of JSONB introduced by PostgreSQL

Faster Operations with the JSONB Data Type in PostgreSQL

【讨论】:

【参考方案2】:

如果不需要交互,只需将它们存储为文本类型(注意文本数据类型的最大大小)。否则 Postgresql 支持 JSON。因此,只需阅读相应的文档https://www.postgresql.org/docs/9.6/static/datatype-json.html

JSON 类型的优点是,Postgresql 可以分析内容,您可以稍后将其用于考虑 JSON 数据结构的 SELECT 语句。

【讨论】:

【参考方案3】:

PostgreSQL 有两种 json 数据类型。来自 Postgres 文档:

有两种 JSON 数据类型:json 和 jsonb。它们接受几乎相同的值集作为输入。 主要的实际区别是效率之一。 json 数据类型存储输入文本的精确副本,处理函数必须在每次执行时重新解析;而 jsonb 数据以分解的二进制格式存储,由于增加了转换开销,因此输入速度稍慢,但处理速度明显加快,因为不需要重新解析。 jsonb 还支持索引,这是一个显着的优势。

所以 TL;DR,Postgres 的 json 将 JSON 存储为文本,需要在检索时重新解析它,而 jsonb 需要更长的时间来存储,但在检索时已经解析,并且 em> 它可以用作数据库中的索引!所以jsonb 可能是大多数时候要走的路

【讨论】:

以上是关于将 json 对象存储到 postgresql 中的数据类型是啥?的主要内容,如果未能解决你的问题,请参考以下文章

postgresql中的Rails json列不接受任何值,并在存储后调用时返回nil

如何在 JSON 字段上应用正则表达式以从中提取某些值并将其存储到 Mule Studio 的 PostgreSQL Dataabse 中?

PostgreSQL 查询包含特定键值的 json 对象中的行

如何将 JSON 对象推送到 postgresql 中 jsonb 列中的数组

jOOQ & PostgreSQL:将从复杂 jsonb 中提取的嵌套 json 对象映射到自定义类型

postgresql 函数 - 如何将新的 json 对象推送到 json 数组?