Postgresql中json和jsonb类型区别

2024-06-05 09:44

本文主要是介绍Postgresql中json和jsonb类型区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在我们的业务开发中,可能会因为特殊【历史,偷懒,防止表连接】经常会有JSON或者JSONArray类的数据存储到某列中,这个时候再PG数据库中有两种数据格式可以直接一对多或者一对一的映射对象。所以我们也可能会经常用到这类格式数据;PG数据库存储json类型数据可以有两种数据类型JSON和JSONB

json和jsonb区别

json和jsonb都可以json和jsonArray类型的数据
在这里插入图片描述
实际上主要区别在于写入和查询效率以及数据存储上面

性能

  • json 数据类型存储了输入文本的精确副本,这意味着每次需要访问或修改数据时,数据库都必须重新解析该文本。这会导致在处理大型 JSON 文档或进行频繁的 JSON 操作时性能下降。
  • 相比之下,jsonb 数据类型将 JSON 数据存储为一种分解好的二进制格式。虽然这在输入时会稍微慢一些,因为需要进行额外的转换,但它在处理时要快得多,因为不需要进行解析。

存储方式

  • json 数据类型保留了输入文本的完整结构,包括可能存在的空格、JSON 对象内部键的顺序以及重复的键/值对。这意味着它提供了一种“所见即所得”的存储方式,但也可能导致不必要的空间占用和可能的性能开销。
  • jsonb 数据类型在存储时会删除不必要的空格、不保留对象键的顺序,并且只保留每个键的最后一个值(如果存在重复键)。这种存储方式更加紧凑,并且可以提高查询和处理的效率。

索引支持

  • jsonb 数据类型支持基于 GIN(Generalized Inverted Index)或 B-tree 的索引,这使得基于 JSON 数据的查询可以更加高效。通过索引,您可以快速检索 JSON 文档中的特定元素或值。
  • json 数据类型则不支持这样的索引,这可能会限制其在大型数据集或需要高性能查询的应用中的使用。

所以我们在不同情况下可以选择不同的数据格式【PS:业务系统大概率是进行单条数据新增,批量数据查询和过滤,这些情况选择什么数据格式大家应该都比较清楚了,如果有特殊情况可以特殊考虑处理,其实根本就是空间换时间】

其他

在创建表的时候发现还有一种数据类型jsonpath,这个数据类型可以存储解析json格式的表达式
在这里插入图片描述

SELECT jsonb_path_query(jsonb_1 ,  jsonpath_1) FROM tb_json;

结果如下
在这里插入图片描述
在一般的业务场景下我们的json格式一般都是固定的,但是有一些特殊情况比如我们抓取一些非格式话的数据的时候可以存储下解析规则,然后对规则进行补全,逐步完善我们数据解析的能力

这篇关于Postgresql中json和jsonb类型区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032724

相关文章

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

Mybatis的mapper文件中#和$的区别示例解析

《Mybatis的mapper文件中#和$的区别示例解析》MyBatis的mapper文件中,#{}和${}是两种参数占位符,核心差异在于参数解析方式、SQL注入风险、适用场景,以下从底层原理、使用场... 目录MyBATis 中 mapper 文件里 #{} 与 ${} 的核心区别一、核心区别对比表二、底

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

C# Semaphore与SemaphoreSlim区别小结

《C#Semaphore与SemaphoreSlim区别小结》本文主要介绍了C#Semaphore与SemaphoreSlim区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、核心区别概览二、详细对比说明1.跨进程支持2.异步支持(关键区别!)3.性能差异4.API 差

Java中自旋锁与CAS机制的深层关系与区别

《Java中自旋锁与CAS机制的深层关系与区别》CAS算法即比较并替换,是一种实现并发编程时常用到的算法,Java并发包中的很多类都使用了CAS算法,:本文主要介绍Java中自旋锁与CAS机制深层... 目录1. 引言2. 比较并交换 (Compare-and-Swap, CAS) 核心原理2.1 CAS

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

python中的鸭子类型详解

《python中的鸭子类型详解》鸭子类型是Python动态类型系统的灵魂,它通过强调“行为”而非“类型”,赋予了代码极大的灵活性和表现力,本文给大家详细介绍python中的鸭子类型,感兴趣的朋友一起看... 目录1. 核心思想:什么是鸭子类型?2. 与“传统”静态类型语言的对比3. python 中无处不在

MySQL 中的 JSON_CONTAIN用法示例详解

《MySQL中的JSON_CONTAIN用法示例详解》JSON_CONTAINS函数用于检查一个JSON文档中是否包含另一个JSON文档,这篇文章给大家介绍JSON_CONTAINS的用法、语法、... 目录深入了解 mysql 中的 jsON_CONTAINS1. JSON_CONTAINS 函数的概述2

Java枚举类型深度详解

《Java枚举类型深度详解》Java的枚举类型(enum)是一种强大的工具,它不仅可以让你的代码更简洁、可读,而且通过类型安全、常量集合、方法重写和接口实现等特性,使得枚举在很多场景下都非常有用,本文... 目录前言1. enum关键字的使用:定义枚举类型什么是枚举类型?如何定义枚举类型?使用枚举类型:2.