当前位置: 首页 > news >正文

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数据库以实现高效的数据检索,确保您的应用程序具有高性能。

相关文章:

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

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

tornado,flaskd这两个框架主要是干什么的

Tornado是一个Python的Web框架&#xff0c;主要用于构建高性能的异步Web应用程序。它基于非阻塞的网络I/O模型&#xff0c;可以处理大量并发连接&#xff0c;适用于需要处理实时性要求较高的应用场景&#xff0c;如实时聊天、实时数据推送等。 Flask是另一个Python的Web框架&a…...

Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导

Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导 Sigrity除了可以进行交流噪声分析,同样也可以进行压降仿真分析,以下图为例. 3D view...

国产游戏技术能否引领全球?

国产游戏技术能否引领全球&#xff1f; 引言 近年来&#xff0c;中国游戏产业如同春天的嫩芽&#xff0c;迅速成长为全球最大的市场之一。或许你会想&#xff0c;国内的游戏开发者到底在技术上取得了多大的成就&#xff1f;这些成就又能否推动中国游戏走向世界&#xff0c;甚…...

【前端】在 Next.js 开发服务器中应该如何配置 HTTPS?

在 Next.js 的开发环境中&#xff0c;默认情况下是使用 HTTP 协议的。但是&#xff0c;您可以通过一些配置来启用 HTTPS。这在开发阶段可能很有用&#xff0c;尤其是在需要测试涉及安全传输的应用场景时。 下面是如何在 Next.js 开发环境中配置 HTTPS 的步骤&#xff1a; 方法…...

基于深度学习算法的动物检测系统(含PyQt+代码+训练数据集)

基于深度学习算法的动物检测系统&#xff08;含PyQt代码训练数据集&#xff09; 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现五、讨论5.1 模型优缺点分析5.2 实验意义 参考资料 前言 本项目是基于Mobil…...

微信小程序美团点餐

引言&#xff1a;外卖已经成为了都市人的必备&#xff0c;在无数个来不及&#xff08;懒得&#xff09;做饭的时刻拯救孤单寂寞的胃。美团外卖无疑是外卖届的领头羊&#xff0c;它的很多功能与设计都值得我们学习。本文将从五个方面&#xff0c;对美团外卖展开产品分析&#xf…...

音频剪辑还花钱?2024年这4款免费工具让你告别烦恼

音乐迷们&#xff01;是不是还在为找个音频剪辑软件就得花钱这事儿头疼呢&#xff1f;别急&#xff0c;2024年有好几个既免费又特别给力的音频剪辑免费的小帮手来了&#xff0c;保证帮你省下这笔钱&#xff0c;还让你用得爽歪歪&#xff01;来来来&#xff0c;让我给你们介绍4个…...

【YOLO模型】(4)--YOLO V3超超超超详解!!!

文章目录 YOLO V3一、改进二、三种scale三、残差连接四、核心网络结构1. 结构2. 输出与先验框关系 五、softmax层替代 总结 YOLO V3 YOLO V3是由Joseph Redmon等人在2018年推出的一款目标检测算法。作为YOLO系列的第三代版本&#xff0c;它在实时性和准确性上取得了显著的提升…...

管理类联考 信息整理和经验分享

说明&#xff1a;大家在准备读MBA之前&#xff0c;肯定会去百度下MBA的相关常识&#xff0c;然而一上某度 你就发现 各种广告、各种培训机构 铺天盖地而来&#xff0c;想了解一些有价值的信息都有些困难&#xff0c;因此这些我在这里做了一些整理&#xff0c;方便准备参加 MBA …...

JetBrains IDE中GPU进程(JCEF)重启问题(Too many restarts of GPU-process)解决方案

目录 前言1. GPU进程重启问题概述1.1 什么是GPU进程重启问题&#xff1f;1.2 该问题带来的影响 2. GPU进程重启问题的原因分析2.1 显卡驱动的兼容性问题2.2 系统资源的限制2.3 JCEF组件的设置不合理 3. 解决方案3.1 方法一&#xff1a;通过自定义属性禁用GPU加速3.2 方法二&…...

《泛基因组:高质量参考基因组的新标准》

摘要 随着三代测序技术的进步和高质量参考基因组的发布&#xff0c;研究者们发现单一个体的参考基因组无法全面代表整个物种的遗传序列。这一现象导致了群体遗传变异图谱的不完整。为了解决这一问题&#xff0c;构建来自多个个体的泛基因组成为一种有效的方法。 泛基因组研究…...

模型其他压缩方法

文章目录 模型蒸馏模型剪枝除了模型量化之外,下面再介绍两种常见的模型压缩方法,即模型蒸馏和模型剪枝。与模型量化不同,模型蒸馏和模型剪枝则通过精简模型的结构,进而减少参数的数量。 不同表示精度的模型性能对比 模型蒸馏 模型蒸馏(ModelDistillation)的目标是将复杂…...

Python学习的自我理解和想法(22)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第22天&#xff0c;学的内容是正则表达式&#xff0c;明天会出一篇详细实例介绍。电脑刚修好&#xff01;开学了&#xff0c;时间不多&…...

基于neo4j的糖尿病知识图谱数据

基于Neo4j的糖尿病知识图谱项目&#xff1a;毕业设计必备&#x1f4a1; 这个项目&#xff0c;专为需要深入挖掘医学或AI数据的朋友们量身定制&#xff0c;尤其适合用于毕业设计&#xff01;如果你对图谱构建、AI问答系统、或者正在学习Neo4j&#xff0c;那么你不得不看看这个技…...

分布式搜索引擎elasticsearch操作文档操作介绍

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;…...

C++ 中的可调用对象

目录 一.可调用对象简介 1.什么是可调用对象&#xff1f; 2.可调用对象有什么用&#xff1f; 二.函数指针和仿函数 1.函数指针 a.函数指针的使用语法 b.函数指针的应用场景 2.仿函数 a.仿函数的基本概念 b.仿函数的优点 三.lambda表达式和function 1.lambda表达式 …...

[HBase]二 HBase原生Shell命令大全

HBase原生Shell命令汇总 1. General组 5 1.1. 查看集群状态:status 5 1.2. 查看表的操作方法:table_help 5 1.3. 查看HBase的版本信息:version 5 1.4. 查看当前用户:whoami 5 2. Namespace组 5 2.1. 创建命名空间:create_namespace 5 2.2. 显示命名空…...

Kafka之消费者客户端

1、历史上的二个版本 与生产者客户端一样&#xff0c;在Kafka的发展过程当中&#xff0c;消费者客户端主要有两个大的版本&#xff1a; 旧消费者客户端&#xff08;Old Consumer&#xff09;&#xff1a;基于Scala语言开发的版本&#xff0c;又称为Scala消费者客户端。新消费…...

使用Python进行数据分析入门

文章目录 Python环境搭建安装Anaconda验证安装 必备库介绍NumPyPandasMatplotlibSciPy 数据导入与清洗导入数据清洗数据 数据探索与分析描述性统计相关性分析 数据可视化绘制直方图 高级主题机器学习深度学习 总结 随着大数据时代的到来&#xff0c;数据分析变得越来越重要。Py…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...