PostgreSQL的奥秘:全面解读JSONB——非结构化数据支持的深入探索

引言
PostgreSQL的JSONB数据类型非常灵活,提供了一套操作符来操作JSON数据。本指南将引导您创建一个包含JSONB数据的表,演示各种JSONB操作符,并讨论如何使用倒排索引和部分索引来优化性能。

理解PostgreSQL中的JSONB

JSONB,即JSON Binary,是PostgreSQL中的一种数据类型,用于以二进制格式存储JSON数据。与JSON数据类型不同,JSONB不是以纯文本形式存储的。相反,它被解析并存储为二进制表示,这带来了几个优点:

  • 高效存储:二进制格式减少了存储空间,特别适用于大型数据集。
  • 快速访问和操作:由于其预解析的特性,JSONB使得读写操作更快。
  • 丰富的查询支持:JSONB支持高级查询能力,允许复杂数据操作,这在使用普通JSON时会很麻烦。

创建包含JSONB的表

首先,让我们创建一个示例表来存储包含JSONB列的产品信息:

CREATE TABLE products (id SERIAL PRIMARY KEY,name TEXT NOT NULL,attributes JSONB
);

JSONB操作符示例

我们将为表填充一些数据,并使用各种操作符来操作和查询这些数据。以下是带有JSONB操作符示例的表格:

-- 插入一些示例数据
INSERT INTO products (name, attributes) VALUES 
('Smartphone', '{"brand": "TechCorp", "model": "X1000", "features": ["5G", "OLED display"]}'),
('Laptop', '{"brand": "ComputeInc", "model": "L200", "features": ["SSD", "16GB RAM"]}');-- JSONB操作符示例表
操作符分类描述示例
@>包含检查左侧JSONB是否包含右侧JSONB。SELECT * FROM products WHERE attributes @> '{"brand": "TechCorp"}';
<@包含检查右侧JSONB是否包含左侧JSONB。SELECT * FROM products WHERE '{"brand": "TechCorp"}' <@ attributes;
?存在检查JSONB对象中是否存在某个键。SELECT * FROM products WHERE attributes ? 'features';
?| 存在检查数组中的任意一个键是否存在于JSONB对象中。SELECT * FROM products WHERE attributes ?| array['brand', 'model'];
?&存在检查数组中的所有键是否存在于JSONB对象中。SELECT * FROM products WHERE attributes ?& array['brand', 'model'];
->路径导航通过键提取JSON对象。SELECT attributes->'brand' FROM products;
->>路径导航通过键以文本形式提取JSON对象。SELECT attributes->>'brand' FROM products;
#>路径导航通过路径提取JSON对象。SELECT attributes#>'{features, 0}' FROM products;
#>>路径导航通过路径以文本形式提取JSON对象。SELECT attributes#>>'{features, 0}' FROM products;
||连接连接两个JSONB对象。UPDATE products SET attributes = attributes || '{"availability": "in stock"}';
-删除从JSONB对象中删除一个键。UPDATE products SET attributes = attributes - 'model';
#-删除从JSONB对象中删除一个路径。UPDATE products SET attributes = attributes #- '{features, 0}';

JSONB与多级嵌套

JSONB不仅允许存储简单的键值对,还支持复杂的嵌套结构。这意味着你可以在JSONB字段中包含对象、数组,以及数组中的对象等等。这样的结构非常适合表示复杂的数据关系,例如产品的规格、用户的层级信息等。

多级嵌套结构的访问

在JSONB中处理多级嵌套数据时,PostgreSQL提供了强大的路径操作符#>,帮助我们从复杂的结构中提取特定的值。让我们通过一个示例来理解这一点。

示例:复杂的产品规格

假设我们有一个products表,其中的attributes列存储了产品的详细规格信息,结构如下:

{"productInfo": {"id": 101,"name": "Smartphone","specifications": {"dimensions": {"weight": "180g","height": "150mm","width": "70mm"},"performance": {"processor": "Octa-core","RAM": "6GB"}}},"availability": "In Stock"
}

如何访问多级嵌套数据

  1. 提取产品名称

    要提取productInfo中的name字段,可以使用如下SQL查询:

    SELECT attributes#>'{productInfo, name}' FROM products;
    
  2. 提取产品重量

    如果需要访问specifications中的dimensions部分的weight信息,SQL查询如下:

    SELECT attributes#>'{productInfo, specifications, dimensions, weight}' FROM products;
    
  3. 获取处理器类型

    要提取嵌套在performance中的processor信息:

    SELECT attributes#>'{productInfo, specifications, performance, processor}' FROM products;
    

性能优化与索引

  1. 理解PostgreSQL中的索引
    PostgreSQL中的索引是用于提高数据检索操作速度的数据结构。它们通过创建一个额外的结构,使数据库引擎能够快速找到满足给定条件的行。然而,索引也引入了权衡,因为它们需要额外的空间,并可能会在写操作(如INSERT、UPDATE、DELETE)时减慢速度,因为索引必须随着数据的变化而更新。

  2. JSONB的倒排索引(GIN索引)
    GIN(通用倒排索引)对于JSONB尤其有效,因为它允许对JSONB数据中的各个键和值进行索引。这使得它适用于需要在JSONB列中搜索特定键值对的查询。

    CREATE INDEX idx_products_attributes ON products USING gin (attributes);
    

    这个索引将提高使用包含操作符(如@>)的查询的性能,通过快速定位相关行。

  3. 特定字段的部分索引
    部分索引是一个强大的工具,可以优化基于特定条件进行过滤的查询。它们仅包含满足给定条件的数据子集,从而导致较小的索引大小和较快的针对这些条件的查询时间。

    CREATE INDEX idx_products_techcorp ON products USING gin (attributes) 
    WHERE attributes->>'brand' = 'TechCorp';
    

    这个部分索引专注于品牌为"TechCorp"的产品,增强了针对这部分数据的查询性能。

结论
PostgreSQL的JSONB操作符提供了一个强大的框架来管理JSON数据,并且通过战略性地使用索引,可以显著提高查询性能。通过利用倒排索引和部分索引,您可以优化PostgreSQL数据库以实现高效的数据检索,确保您的应用程序具有高性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/461997.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机性、熵与随机数生成器:解析伪随机数生成器(PRNG)和真随机数生成器(TRNG)

随机性在诸多领域中扮演着至关重要的角色,涵盖密码学、仿真和机器学习等方面。因为随机性为无偏决策、不可预测序列和安全加密提供了基础。然而生成随机数是一项复杂的任务,理解伪随机数生成(pseudo-random number generation, PRNG)与真随机数生成(true random number generat…

从零开始点亮一个LED灯 —— keil下载、新建工程、版本烧录、面包板使用、实例代码

一、keil下载 参考视频&#xff1a;Keil5安装教程视频 (全套资料51和32皆可用Keil5编译设置)_哔哩哔哩_bilibili 视频内容包括下载链接、安装教程、库导入&#xff0c;非常详细&#xff01; 二、新建工程 2.1.使用stm32CubeMX新建工程 10. 使用STM32CubeMX新建工程 — [野…

嵌入式硬件电子电路设计(三)电源电路之负电源

引言&#xff1a;在对信号线性度放大要求非常高的应用需要使用双电源运放&#xff0c;比如高精度测量仪器、仪表等;那么就需要给双电源运放提供正负电源。 目录 负电源电路原理 负电源的作用 如何产生负电源 负电源能作功吗&#xff1f; 地的理解 负电压产生电路 BUCK电…

互斥量的使用

官方的描述 互斥量主要是对于共享资源的保护 其中参数要注意 osMutexRecursive&#xff1a;//递归互斥量 互斥锁嵌套属性&#xff0c;同一个线程可以在不锁定自身的情况下多次使用互斥锁。每当拥有互斥锁的线程获得互斥锁时&#xff0c;锁计数就会增加。互斥锁也必须被释放多次…

商务英语学习柯桥学外语到泓畅-老外说“go easy on me”是什么意思?

在口语中“go easy on sb ”这个短语是很常见的 01 go easy on me 怎么理解&#xff1f; 在口语中&#xff0c;“go easy on me”是一个非常常见的表达&#xff0c;通常表示请求对方在某方面对自己宽容一些&#xff0c;不要对自己太过苛刻或严厉。 短语&#xff08;go&#xff…

vscode在cmake config中不知道怎么选一个工具包?select a kit

vscode在cmake config中不知道怎么选一个工具包&#xff0c;或者发现一直在用VS的工具包想换成自己的工具包。select a kit vscode在cmake config中不知道怎么选一个工具包&#xff0c;或者发现一直在用VS的工具包想换成自己的工具包。select a kit 1.在VSCode中 按ctrlshift…

SpringBoot【实用篇】- 热部署

文章目录 目标:1.手动启动热部署2.自动启动热部署4.禁用热部署 目标: 手动启动热部署自动启动热部署热部署范围配置关闭热部署 1.手动启动热部署 当我们没有热部署的时候&#xff0c;我们必须在代码修改完后再重启程序&#xff0c;程序才会同步你修改的信息。如果我们想快速查…

AI 原生时代,更要上云:百度智能云云原生创新实践

本文整理自百度云智峰会 2024 —— 云原生论坛的同名演讲。 我今天分享的主题&#xff0c;是谈谈在云计算和 AI 技术快速发展和深入落地的背景下&#xff0c;百度智能云在云原生的基础设施产品和技术层面做的一些创新实践。 毋庸置疑&#xff0c;过去十几年云计算和 AI 技术是…

Java项目实战II基于Java+Spring Boot+MySQL的植物健康系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 基于Java、…

BGP路径属性与路由反射器

前言 IBGP水平分割规则用于防止AS内部产生环路&#xff0c;在很大程度上杜绝了IBGP路由产生环路的可能性&#xff0c;但是同时也带来了新的问题&#xff1a;BGP路由在AS内部只能传递一跳&#xff0c;如果建立IBGP对等体全互联模型又会加重设备的负担。 BGP 路径属性 AS_Path …

uniapp学习(010-2 实现抖音小程序上线)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第113p的内容 文章目录 抖音小程序下载抖音开发者工具先去开发者工具里进行测试 抖音开放平台配置开始打包上传…

无线基础配置

配置图 各部分配置 AC1 vlan b [AC6605]vlan batch 10 20 100 Info: This operation may take a few seconds. Please wait for a moment...done. [AC6605]int [AC6605]interface g [AC6605]interface GigabitEthernet 0/0/2 [AC6605-GigabitEthernet0/0/2]port …

影刀RPA实战:识别简单计算验证码

1.官方计算验证码 基于影刀AI引擎的验证码识别指令&#xff0c;该指令不是长期免费&#xff0c;有一定的免费额度&#xff0c;用完之后需要我们到影刀官方充值。 上图使我们要识别的计算验证码 影刀指令代码&#xff1a; 配置我们选择计算题&#xff0c;文件路径本次指定本地…

HarmonyOS:UIAbility组件概述

一、概述 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。 UIAbility的设计理念&#xff1a; 原生支持应用组件级的跨端迁移和多端协同。支持多设备和多窗口形态。 UIAbility划分原则与建议&#xff1a; UIAbility组件是系统调度的基本单元&#xff0c…

单链表的基本操作实现

定义 链表节点长这个样子&#xff0c;数据域data指针域next指向下一个结点 typedef struct lnode {int data;struct lnode *next; }lnode ,*linklist; 初始化 /*初始化*/ linklist f1(){linklist l(linklist)malloc(sizeof(lnode));l->nextNULL;return l; }int main(){l…

C++ 优先算法——复写零(双指针)

目录 题目&#xff1a;复写零 1. 题目解析 2. 算法原理 一. 先找到最后一个“复写”数 处理边界情况 二. 复写操作 3. 代码实现 题目&#xff1a;复写零 1. 题目解析 题目截图&#xff1a; 该题目要求的与移动零相似&#xff0c;都要在一个数组上进行操作&#xff0c;…

使用linuxdeployqt打包Qt程序问题及解决方法

dpkg: 处理归档 libmysqlclient18_5.6.25-0ubuntu1_amd64.deb (--install)时出错&#xff1a; 预依赖问题 - 将不安装libmysqlclient18:amd64 在处理时有错误发生&#xff1a; libmysqlclient18_5.6.25-0ubuntu1_amd64.deb下载libmysqlclient18/5.6.25 libmysqlclient18/5.6…

配置BGP与IGP交互和路由自动聚合示例

组网需求 如图所示&#xff0c;用户将网络划分为AS65008和AS65009&#xff0c;在AS65009内&#xff0c;使用IGP协议来计算路由&#xff08;该例使用OSPF做为IGP协议&#xff09;。要求实现两个AS之间的互相通信。 配置思路 采用如下的思路配置BGP与IGP交互&#xff1a; 在AR…

基于SpringBoot的健身房系统的设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

flex 布局比较容易犯的错误 出现边界超出的预想的情况

flex 布局比较容易犯的错误 出现边界超出的预想的情况 如图 当使用flex布局时&#xff0c;设置flex:1 或者是flex:x 时 如果没有多层嵌套的flex布局&#xff0c;内容超出flex&#xff1a;1规定的后&#xff0c;仍然会撑大融器 在flex:1 处设置 overflow:hidden 即可超出后不显…