数据库管理-第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关系二元性视图其他操作将放在下一期。
老规矩,知道写了些啥。

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

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

相关文章

【LeetCode:LCR 077. 排序链表 + 链表】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Audition处理音频文件背景音(保留人声)

音频文件背景音可以使用Adobe Audition进行处理,Adobe Audition的下载与安装见之前博客: Adobe Audition 2024 下载与安装-CSDN博客https://blog.csdn.net/xiaoxian666/article/details/138612837?spm1001.2014.3001.5502 一、选中一段不含人声的背景…

品牌舆情监测工作要怎么做?

一个负面舆论的传播,可能在短时间内对企业品牌形象造成巨大损害,甚至引发舆情危机。因此,如何有效地进行品牌舆情监测,成为企业不可忽视的问题。伯乐网络传媒多年网络公关、舆情监测经验,今天就来给大家分享一下。 一、…

探索C++的string:从基础到深入

文章目录 string类string类的接口string的常见构造string类对象的容量操作string类的遍历及访问操作string类对象的修改操作string类的非成员函数 总结 string类 C中的string类是一个非常重要的字符串处理工具,它提供了一种方便且灵活的方式来处理字符串。它位于标…

VTK数据的读写--Vtk学习记录1--《VTK图形图像开发进阶》

读和写操作是VTK可视化管线两端相关的类--Reader和Writer类 Reader:将外部数据读入可视化管线,主要步骤如下 s1:实例化Reader对象 s2:指定所要读取的文件名 s3:调用Update()促使管线执行 对应的Writer: s1:实例化Writer对象 s2输入要写的数据以及指定写入的文…

Kafk设计篇01(设计动机+持久化)

背景 本篇文章基于最新版本:kafka 3.7,其他版本的设计,请参考官网: https://kafka.apache.org/documentation/设计动机 任何组件都有它存在的必要,必然是要解决某一类问题的。我们来看看kafka设计的初衷如何。 kaf…

加密“发射台”:未来通信的新模式

随着区块链技术的飞速发展,加密“发射台”作为一种新兴的安全通信工具,正逐渐受到关注。本文将从专业角度深入探讨加密“发射台”的概念、原理、应用场景及其未来发展趋势,以期为读者提供有深度和逻辑性的思考。 一、加密“发射台”的概念与…

产品推荐 | 基于 Zynq UltraScale+ RFSoC 的iW-RainboW-G42M 核心板

01 产品概述 Xilinx Zynq UltraScale基于RFSoC的系统模块采用带有FFVF1760封装的Zynq ScaleRFSoC ZU49/ZU39/ZU29设备。RFSoC支持高达1.3GHz的Quad Cortex A53和高达533MHz的Dual Cortex R5F。SOM支持高达16通道的射频ADC2.5Gsps和16通道的RF DAC10Gsps,所有这些都…

使用nvm安装node.js过程

今天Jade尝试安装nvm,并使用命令安装node.js但是碰到了一些问题,在此作为学习记录分享出来。希望可以留下深刻的印象: 1、概念了解 nvm----- (Node.js version manager)是一个命令行应用,可以协助您快速地 更新、安装、使用、卸载…

鲁大师4月新机性能/流畅/AI/久用榜:骁龙中端双子星表现亮眼,接下来应该是中端机的主场

时间来到5月份,伴随着中考、高考以及暑假将至,以学生家庭为主力的暑期换机潮即将拉开序幕。同时,恰逢骁龙新中端芯片骁龙8s Gen3和7 Gen3的发布,一大批在性能上极具竞争力的中端机型也已经跃跃欲试,为这次的换机潮开始…

net7部署经历

1、linux安装dotnet命令: sudo yum install dotnet-sdk-7.0 或者直接在商店里安装 2、配置反向代理 127.0.0.1:5000》localhost 访问后报错 原因:数据表驼峰名, 在windows的数据表不区分大小写,但是在linux里面是默认区分的&…

C++ | Leetcode C++题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int p0 0, p2 n - 1;for (int i 0; i < p2; i) {while (i < p2 && nums[i] 2) {swap(nums[i], nums[p2]);--p2;}if (nums[i…

ESD静电问题 | 手持摄像头整改

【转自微信公众号&#xff1a;柯普伦科技】

Java八股文系列之四(JVM)

什么是Java虚拟机&#xff1f;为什么Java被称作是“平台无关的编程语言”&#xff1f; Java虚拟机是一个可以执行Java字节码的虚拟机进程。 Java 实现跨平台的主要原因在于它的编译和执行方式。Java 程序首先被编译成中间代码&#xff08;bytecode&#xff09;&#xff0c;然…

Android 查看CUP占用率

查看每个进程CUP占用率的几种方式,由于自己充电界面老是导致整机温度过高&#xff0c;后面发现自己的线程一直在跑&#xff0c;相当于死循环&#xff0c;后面加上sleep才得以改善&#xff1b;先看看几种查询方式吧。 1、adb shell top 2、adb shell busybox top 3、adb shell …

Linux 基础命令、性能监控

一、Linux 基础命令 grep&#xff1a;在文件中执行关键词搜索&#xff0c;并显示匹配的结果。 -c 仅显示找到的行数 -i 忽略大小写 -n 显示行号 -v 反向选择: 仅列出没有关键词的行 (invert) -r 递归搜索文件目录 -C n 打印匹配行的前后 n 行grep login user.cpp # 在…

副产物三氟甲烷综合利用技术路线多 行业发展受到国家政策支持

副产物三氟甲烷综合利用技术路线多 行业发展受到国家政策支持 氟化工行业生产过程中的副产物内包括三氟甲烷&#xff0c;直接排放进入自然界会污染大气&#xff0c;且会造成资源浪费。副产物三氟甲烷综合利用&#xff0c;是以工业副产物三氟甲烷为原料制备其他化学品的过程&…

Pytorch入门—Tensors张量的学习

Tensors张量的学习 张量是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似。在PyTorch中&#xff0c;我们使用张量来编码模型的输入和输出&#xff0c;以及模型的参数。 张量类似于NumPy的ndarrays&#xff0c;只是张量可以在GPU或其他硬件加速器上运行。事实上&#xf…

echarts双Y轴,并实现图例等

一个Y轴时yAxis为对象 yAxis: {type: value,name: 占比(%) },两个Y轴时yAxis为数组 yAxis: [{ // 左侧的type: value,name: 占比(%),nameTextStyle: {padding: [0, 0, 10, -50]},min: 0,max: 100,splitNumber: this.splitNumber, // 设置坐标轴的分割段数interval: 20, // 标轴…

Python | Leetcode Python题解之第69题x的平方根

题目&#xff1a; 题解&#xff1a; class Solution:def mySqrt(self, x: int) -> int:if x 0:return 0C, x0 float(x), float(x)while True:xi 0.5 * (x0 C / x0)if abs(x0 - xi) < 1e-7:breakx0 xireturn int(x0)