数据库管理-第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为指定嵌套对象中的属性何时应取消嵌套到父对象中。

:这部分还不是很理解,测试也没得到啥结果,希望后面更多实验后能理解,或者官方给出更加明显的案例。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

出差——蓝桥杯十三届2022国赛大学B组真题

问题分析 该题属于枚举类型&#xff0c;遍历所有情况选出符合条件的即可。因为只需要派两个人&#xff0c;因此采用两层循环遍历每一种情况。 AC_Code #include <bits/stdc.h> using namespace std; string str;//选择的两人 bool ok(){if(str.find("A")!-1…

SwiGLU激活函数

SwiGLU激活函数已经成为LLM的标配了。它是GLU的变体&#xff0c;公式如下&#xff1a; SwiGLU ⁡ ( x , W , V , b , c , β ) Swish ⁡ β ( x W b ) ⊗ ( x V c ) \operatorname{SwiGLU}(x, W, V, b, c, \beta)\operatorname{Swish}_\beta(x Wb) \otimes(x Vc) SwiGLU(x,…

CSS---复合选择器和元素显示模式(三)

一、CSS的复合选择器 1.1 什么是复合选择器 在CSS中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器&#xff0c;复合选择器是建立在基础选择器之上&#xff0c;对基本选择器进行组合形成的。 复合选择器是由两个或多个基础选择器连写组成&#xff0c;它…

从Python整数变量内存大小占用28字节谈起

实验结果 本机环境64位Python 3.12 内存布局图 0 4 8 12 16 20 24 28 |----------|----------|----------|----------|----------|----------|----------| | ob_refcnt | ob_type | ob_digit | …

【大数据】分布式数据库HBase下载安装教程

目录 1.下载安装 2.配置 2.1.启动hadoop 2.2.单机模式 2.3.伪分布式集群 1.下载安装 HBase和Hadoop之间有版本对应关系&#xff0c;之前用的hadoop是3.1.3&#xff0c;选择的HBase的版本是2.2.X。 下载地址&#xff1a; Index of /dist/hbase 配置环境变量&#xff1a…

红米1s 刷入魔趣 (Mokee)ROM(Android 7.1)

目录 背景准备工具硬件&#xff08;自己准备&#xff09;软件&#xff08;我会在文末提供链接&#xff09; 刷机步骤1. 重启电脑2. 安装驱动3. 刷入TWRP4. 清空数据5. 刷入魔趣6. 开机 结尾下载链接 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 B…

LeetCode 138. 随机链表的复制

目录 1.原题链接&#xff1a; 2.结点拆分&#xff1a; 代码实现&#xff1a; 3.提交结果&#xff1a; 4.读书分享&#xff1a; 1.原题链接&#xff1a; 138. 随机链表的复制 2.结点拆分&#xff1a; ①.拷贝各个结点&#xff0c;连接在原结点后面&#xff1b; ②.处…

Lora基础炼丹学习笔记

1、收集数据集 20-30张人物各个角度、各个姿势的图片 2、图片预处理 裁剪 打标签 裁剪必须也要512 * 512 &#xff0c;因为sd1.5就是用这个尺寸训练的&#xff0c;可以使用后期处理 打标可以勾选这个&#xff0c;Deepbooru对二次元画风更友好 打标也可以使用wb14-tagger的…

Centos7 安装 MySQL5.7 使用 RPM 方式

1 访问网站 https://downloads.mysql.com/archives/community/ 选择合适的版本&#xff0c;点击 Download。 2 上传下载好的 mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar 文件到 Centos7 机器&#xff0c;这里放到了 下载 目录。 3 解压 mysql-5.7.44-1.el7.x86_64.rpm-bundle.…

力扣每日一题119:杨辉三角||

题目 简单 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出…

如何用多个高斯泼溅合成新的场景【3DGS】

3D高斯泼溅&#xff08;3D Gaussian Splatting&#xff09;作为一种突破性摄影测量和可视化技术作为 SIGGRAPH 2023 上发表的研究论文的一部分发布。我相信3DGS是允许像你我这样的日常用户扫描 3D 的最佳现代方法并保留有机材料的精细细节&#xff0c;尤其是植物、树木、花卉和…

【青龙面板教程】保姆级拉库 Faker库 以及依赖安装教程

青龙面板最新版拉库教程 新版青龙&#xff08;订阅&#xff09;拉库教程 拉库前请打开青龙面板-配置文件 第18行 GithubProxyUrl"" 双引号中的内容清空复制以下拉库命令即可。Faker2 助力池版【安全本地sign防CK泄漏】使用助力池请在群里发"助力池" 机器…

初阶数据结构之单链表详解

目录 一&#xff1a;单链表概念 二&#xff1a;单链表的基本操作 1.定义结点 2.创建链表&#xff08;初始化链表&#xff09; 3:新增结点 4.单链表尾插 5.单链表头插 6.单链表尾删 7&#xff1a;单链表头删 8.打印单链表 9.查找单链表结点 10.单链表删除指定结点 1…

【C语言】static关键字用法

目录 一、static修饰局部变量 二、static修饰全局变量 三、static修饰函数 一、static修饰局部变量 首先我们来看两段代码: 代码1&#xff08;不加static&#xff09; #include <stdio.h> void test() {int i 0;i;printf("%d ", i); } int main() {int i…

UE5材质基础(2)——数学节点篇

UE5材质基础&#xff08;2&#xff09;——数学节点篇1 目录 UE5材质基础&#xff08;2&#xff09;——数学节点篇1 Add节点 Append节点 Abs节点 Subtract节点 Multiply节点 Divide节点 Clamp节点 Time节点 Lerp节点 Add节点 快捷键&#xff1a;A鼠标左键 值相加…

C++学习第十二天(继承)

1、继承的概念以及定义 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行拓展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#x…

EditReady for Mac激活版:专业视频转码工具

对于视频专业人员来说&#xff0c;一款高效的视频转码工具是不可或缺的。EditReady for Mac正是这样一款强大的工具&#xff0c;它拥有简洁直观的操作界面和强大的功能&#xff0c;让您的视频处理工作事半功倍。 EditReady for Mac支持多种视频格式的转码&#xff0c;并且支持常…

多线程学习Day09

10.Tomcat线程池 LimitLatch 用来限流&#xff0c;可以控制最大连接个数&#xff0c;类似 J.U.C 中的 Semaphore 后面再讲 Acceptor 只负责【接收新的 socket 连接】 Poller 只负责监听 socket channel 是否有【可读的 I/O 事件】 一旦可读&#xff0c;封装一个任务对象&#x…

阿里云VOD视频点播流程(2)

二、视频点播 1、入门代码 基于OSS原生SDK上传 &#xff0c;参考文档&#xff1a;https://help.aliyun.com/zh/vod/user-guide/upload-media-files-by-using-oss-sdks?spma2c4g.11186623.0.0.1f02273fj4lxNJ 视频点播面向开发者提供了丰富的上传方式&#xff0c;其中上传SDK&…

软件测试实战项目(含电商、银行、APP等)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 今天给大家带来几个软件测试项目的实战总结及经验&#xff0c;适…