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

数据库管理-第185期 23ai:一套关系型数据干掉多套JSON存储(20240508)

数据库管理185期 2024-05-08

  • 数据库管理-第185期 23ai:一套关系型数据干掉多套JSON存储(20240508)
    • 1 上期示例说明
    • 2 两个参数
      • 2.1 NEST/UNNEST
      • 2.2 CHECK/NOCHECK
    • 3 一数多用
      • 3.1 以用户维度输出订单信息
      • 3.2 以产品维度
      • 3.3 以产品种类维度
    • 4 美化输出
    • 总结

数据库管理-第185期 23ai:一套关系型数据干掉多套JSON存储(20240508)

作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Associate: Database(Oracle与MySQL)
PostgreSQL ACE Partner
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、认证技术专家、年度墨力之星,ITPUB认证专家、专家百人团成员,OCM讲师,PolarDB开源社区技术顾问,OceanBase观察团成员
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭

上一期通过一个简单的示例展示了JSON关系二元性视图,视图创建了,但是里面很多内容,比如映射关系、数据关系维护等等都没有深入讲,还有就是如何用一套关系表数据实现多个JSON关系二元性视图。

1 上期示例说明

这里展示一下表和视图之间的一些映射关系:
image.png

  • 箭头指定了每个表在视图中的位置,其中最外层的是orders表,根据订单展示需求持续向内嵌套
  • 各个主键(应当包含唯一约束列)都出现在了每一层表映射内容中
  • 这里列之间的关联关系以及如何输出数据是由主外键关系实现的
  • 这里创建视图使用的是GraphQL,这种方式可以用直接匹配输出结果的方式编写语句,也有以SQL定义,下面是官方文档提供的一个范例:
    image.png
  • NEST/UNNEST:这个放在下一节讲解
  • 增删改:默认都是允许的JSON关系二元性视图是只读的,不能增删改,在使用GraphQL的模式下使用@[no]insert, @[no]update, @[no]elete,@[no]check;SQL下则是WITH [NO]INSERT [NO]UPDATE [NO]DELETE ;可以控制到每张表的级别。下面是官方文档提供的两个范例:
    image.png
    image.png
    对于上一期的范例就是只能增删改orders表涉及的字段。
    对于数据修改,特别是原来JSON存储的冗余数据,由于底层数据存储不存在冗余,现在可以仅在JSON关系二元性视图中更新一条数据即可修改所有相关JSON数据展示;也可以修改底层关系表实现
  • CHECK:这个放在下一节讲解

2 两个参数

2.1 NEST/UNNEST

关于SQL中的unnest和nest,GraphQL中为@unnest, @nest,每个视图都定义了两个版本,其中一个包含嵌套对象,另一个使用关键字UNNEST定义,将嵌套对象展开为直接包含其字段,unset为指定嵌套对象中的属性何时应取消嵌套到父对象中。
这里直接通过下面的案例即可直观了解NEST/UNNEST的作用:

--新创建两个简单点的JSON关系二元性视图,分别使用@unnest和不指定
CREATE JSON DUALITY VIEW orders_jdv_unnest AS
orders
{_id          : order_id,ordertime    : order_time,customers @unnest{cid        : customer_id,customer   : customer_name}
};
select json_serialize(t.data PRETTY) from orders_jdv_unnest t;CREATE JSON DUALITY VIEW orders_jdv_nest AS
orders
{_id          : order_id,ordertime    : order_time,customers{cid        : customer_id,customer   : customer_name}
};
select json_serialize(t.data PRETTY) from orders_jdv_nest t;

e55b45f252032dda477a7311ef5de09.png
1d557ba749c76b5039b15688caebc6b.png
其实UNNEST就是将嵌套的JSON内容作为上级字段直接展开输出,而NEST则是仍以嵌套JSON格式输出。

2.2 CHECK/NOCHECK

@[no]check/WITH [NO]CHECK,包括/排除ETAG的校验字段的步骤:
指定文档的部分内容在文档更新时是否检查state/version(状态/版本)。当更新文档时,通常需要上次数据库操作文档后,正在更新的文档的state/version不发生变化。
实现方法是使用无锁的乐观并发控制。默认情况下,JSON关系二元性视图支持每个文档在ETAG字段,即_metadata内的etag中记录一个文档状态签名。字段值被由文档内容和一些其他信息的哈希值,每次操作文档时都会被自动更新。
文档的更新操作会根据时间更新etag的值,并将该值与要更新的文档中之前存储的etag值(由应用程序发送)进行核对。如果两个值不一致则更新操作会失败。这种情况下,应用程序会重新从数据库数据库获取最新的etag值,然后再次尝试修改数据。
默认情况下,文档的所有字段的操作都需要校验etag的值。将指定字段排除校验之外,可以使用@nocheck/WITH NOCHECK来实现。在表级指定NOCHECK可以让这张表涉及所有列排除在校验之外,这种情况下在某些列上加上CHECK则可以将这些列的操作进行校验。也可以将NOCHECK指定到指定列以排除该列更新时校验etag值。
如果更新操作成功,则会进行它定义的所有更改,包括对未参与ETAG校验的字段的任何更改,从而覆盖在此期间可能对该字段进行的任何更改。也就是说,对于更新操作,不属于ETAG校验的字段不会被忽略。
如果没有列被标记NOCHECK,那么作为一个整体的JSON关系二元性视图的文档被操作时都会校验etag;如果所有列都被标记NOCHECK,则整个文档的操作都不会校验etag。这可以提高性能,对于较大的文档,这种提升更为显著。在以下情况下可能希望JSON关系二元性视图排除所有ETAG校验:

  • 应用程序有自己的并发控制方式,因此不需要数据库ETAG校验
  • 应用程序是单线程的,不可能同时对数据进行修改

3 一数多用

先增加一部分数据:

--orders
insert into orders values(12345682,to_timestamp('2024-05-07 09:42:21','yyyy-mm-dd hh24:mi:ss'),123456);
insert into orders values(12345683,to_timestamp('2024-05-07 09:45:25','yyyy-mm-dd hh24:mi:ss'),234567);
insert into orders values(12345684,to_timestamp('2024-05-07 09:48:01','yyyy-mm-dd hh24:mi:ss'),456789);
insert into orders values(12345685,to_timestamp('2024-05-07 09:51:44','yyyy-mm-dd hh24:mi:ss'),345678);--order_details
insert into order_details values(11,12345685,98765);
insert into order_details values(12,12345685,87654);
insert into order_details values(13,12345683,87654);
insert into order_details values(14,12345684,65432);
insert into order_details values(15,12345684,76543);
insert into order_details values(16,12345682,98765);
insert into order_details values(17,12345682,98765);
insert into order_details values(18,12345682,87654);
insert into order_details values(19,12345683,76543);
insert into order_details values(20,12345684,65432);commit;

image.png
现在尝试用一套关系表数据解决多套需求:

3.1 以用户维度输出订单信息

CREATE JSON DUALITY VIEW customers_jdv AS
customers
{_id          : customer_id,customer     : customer_name,order        : orders[ {oid         : order_id,ordertime   : order_time,details     : order_details[ {subid  : sub_id,products{pn        : product_id,pname     : product_name,price     : price_number,       product_type @unnest{typeid  : type_id,type    : type_name}}} ]} ]
};

image.png

3.2 以产品维度

CREATE JSON DUALITY VIEW products_jdv AS
products
{_id          : product_id,pname        : product_name,price        : price_number,product_type @unnest{typeid      : type_id,type        : type_name},order_details[ {subid       : sub_id,orders @unnest{order       : order_id,ordertime   : order_time,customers @unnest{cid       : customer_id,customer  : customer_name}}} ]
};

image.png

3.3 以产品种类维度

CREATE JSON DUALITY VIEW type_jdv AS
product_type
{_id          : type_id,type         : type_name,products[ {pn           : product_id,pname        : product_name,price        : price_number,order_details[ {subid       : sub_id,orders @unnest{order       : order_id,ordertime   : order_time,customers @unnest{cid       : customer_id,customer  : customer_name}}} ]} ]
};

image.png

4 美化输出

这里可以在SQL中使用json_serialize函数美化输出:

select json_serialize(t.data PRETTY) from orders_jdv t;

image.png
也可以使用最新的SQLDeveloper 23.1.1来试试:
image.png
image.png

总结

本期展示了JSON关系二元性视图更详细的内容,如何用一套数据实现多个JSON模型需求,以及在SQL层面美化JSON输出。
更多的关于JSON关系二元性视图其他操作将放在下一期。
老规矩,知道写了些啥。

相关文章:

数据库管理-第185期 23ai:一套关系型数据干掉多套JSON存储(20240508)

数据库管理185期 2024-05-08 数据库管理-第185期 23ai:一套关系型数据干掉多套JSON存储(20240508)1 上期示例说明2 两个参数2.1 NEST/UNNEST2.2 CHECK/NOCHECK 3 一数多用3.1 以用户维度输出订单信息3.2 以产品维度3.3 以产品种类维度 4 美化输出总结 数…...

7 zip 介绍

7-Zip是一款广受好评的开源文件存档与压缩工具,支持高比率的压缩,适用于Windows、Linux和macOS等多种操作系统平台。以下是关于7-Zip的详细介绍: - **高压缩比**:7-Zip最显著的特点是其提供的高压缩率,尤其是使用其独…...

前端页面 贴边拖拽 盒子

vue 悬浮球(带自动吸附功能)_vue悬浮球-CSDN博客...

【408真题】2009-10

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…...

WebSocket概述

TCP和HTTP规范有连接超时一说,所以长轮询并不能一直持续,服务端和客户端的连接需要定期的连接和关闭再连接。 WebSocket在请求头中有一个Connection:Upgrade字段,表示客户端想对协议进行升级,还有一个Upgrade:websocket字段&…...

人机协同是虚拟与真实的协同

“人机协同”是指人类与机器之间的合作与协同工作。在这种协同中,机器可以作为助手、辅助或扩展人类的能力,帮助人们完成任务,提高工作效率和质量。 虚拟与真实的协同是指在人机协同的过程中,虚拟想象世界和真实世界之间的协同。通…...

【编程向导】Docker-常用命令

常用命令 管理命令 管理命令说明builder管理构建config管理配置container管理容器context管理上下文engine管理引擎image管理镜像network管理网络node管理 Swarm 节点plugin管理插件secret管理 Docker secretsservice管理服务stack管理 Docker stacksswarm管理 Swarm 集群sys…...

LeetCode题练习与总结:不同的二叉搜索树Ⅱ--95

一、题目描述 给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1: 输入:n 3 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,nul…...

idea SpringBoot + Gradle 环境配置到项目打包

一、前言 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。 面向Java应用为主。当前其支持…...

深入理解tengine的sysguard模块

目录 1. 引言2. 开启sysguard模块2.1 编译2.2 配置3. 源码分析3.1 配置参数分析3.2 模块的初始化3.3 ngx_http_sysguard_handler函数3.4 各项负载指标的获取3.4.1 load系统负载的获取3.4.2 cpu使用率的获取3.4.3 内存使用情况的获取3.3.5 请求平均响应时间的获取1. 引言 Tengin…...

探索多模态LLM作为驾驶的世界模型

24年5月MIT的论文“Probing Multimodal LLMs as World Models for Driving”。 主要对多模态大语言模型(MLLM)在自动驾驶领域的应用进行了审视,并挑战/验证了一些常见的假设,重点关注它们通过图像/帧序列推理和解释在闭环控制环境…...

掌握Vim:Linux系统维护的瑞士军刀 - 常用命令深度解析

在Linux的世界里,Vim编辑器犹如一位沉默的剑客,它的命令就是那锋利的剑刃,能够在代码的海洋中劈波斩浪。对于每一位Linux系统用户来说,掌握Vim的常用命令,就如同获得了维护系统的瑞士军刀。今天,让我们一起…...

C++数组和指针应用实例 -- 实现计算器

C 的数组和C 语言一样&#xff0c;C完全兼容C语言的指针&#xff0c;但是会多出一个this指针 用C实现计算器 case1: 基本实现: #include <iostream>using namespace std;int add(int a,int b) {return ab; }int minu(int a,int b) {return a-b; }int mul(int a,int b) …...

【多电压流程 Multivoltage Flow】- 5.特定工具使用建议(6.Formality)

使用Formality进行形式验证 Formality支持具有低功耗特性的功能等效性检查,如时钟门控、多阈值电压(multiple-Vt)、多电压供电、电源门控以及动态电压和频率缩放。Formality能够识别低功耗单元,例如隔离单元、电平转换器、始终开启单元、保持寄存器和电源门。 Formality支持…...

力扣 72. 编辑距离 python AC

动态规划 class Solution:def minDistance(self, word1, word2):size1 len(word1)size2 len(word2)dp [[0] * (size2 1) for _ in range(size1 1)]for i in range(1, size1 1):dp[i][0] dp[i - 1][0] 1for i in range(1, size2 1):dp[0][i] dp[0][i - 1] 1for i in…...

vue 发布项目

You are not allowed to force push code to a protected branch on this project. 分支做了保护&#xff0c;git中设置允许强制推送...

springBoot实现发送邮箱验证码 redis缓存源码

要在Spring Boot中实现发送邮箱验证码并使用Redis进行缓存&#xff0c;你需要遵循几个步骤。以下是一个简化的示例&#xff0c;展示了如何整合这些功能&#xff1a; 添加依赖 首先&#xff0c;确保你的pom.xml&#xff08;Maven&#xff09;或build.gradle&#xff08;Gradle…...

QT--4

QT 使用定时器完成闹钟 #include "widget.h" #include "ui_widget.h"void Widget::timestart() {timer.start(1000); }void Widget::timeend() {timer.stop(); }Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(t…...

感染了后缀为.360勒索病毒如何应对?数据能够恢复吗?

导言&#xff1a; 在数字化时代的浪潮中&#xff0c;网络安全问题如同暗流涌动&#xff0c;威胁着每一个互联网用户的安宁。而近年来&#xff0c;一种名为.360勒索病毒的新型网络威胁逐渐浮出水面&#xff0c;以其独特的加密方式和狡猾的传播策略&#xff0c;给全球网络安全带…...

JavaSE多态

多态&#xff1a;一个对象在不同条件下表示的不同形态就叫多态。在程序中&#xff0c;多态是父类引用指定子类对象就叫多态。 多态是面向对象程序设计中的第三个特征 // 多态 class Father {String name;public void desc() {System.out.println("----------");Sys…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...