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

news2024/11/24 11:37:37

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

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

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

相关文章

Debian——安装syzkaller——2024

系统:Debian 远程连接——我是不想安装tools没有办法复制黏贴,所以远程,根据个人情况选择是否远程连接 就是说使用Windows自带的远程mstsc,使用的不是ssh22端口,是TCP 3389端口 mkdir debian cd debian 二:安装go编译器 打开终端。使用wget命令从官方网站或可信的镜像…

Flink 部署模式

目录 概述 部署模式 会话模式(Session Mode) 单作业模式(Per-Job Mode) 应用模式(Application Mode) 运行模式(资源管理模式) Standalone运行模式 会话模式部署 应用模式部署 Yarn运行模式 会话模式部署 单作业模式部…

「Java开发指南」如何用MyEclipse搭建GWT 2.1和Spring?(一)

本教程将指导您如何生成一个可运行的Google Web Toolkit (GWT) 2.1和Spring应用程序,该应用程序为域模型实现了CRUD应用程序模式。在本教程中,您将学习如何: 安装Google Eclipse插件为GWT配置一个项目搭建从数据库表到一个现有的项目GWT编译…

护眼灯作用大吗?分享五款优质护眼台灯,守护视力健康

护眼灯作用大吗?这是许多人在考虑选购护眼台灯时会思考的问题。其实只要是有使用过护眼台灯的会发现,它发散出来的光线柔和,能够有效防蓝光、眩光,这样的光线环境对眼睛十分友好,从而能够有效缓解视觉疲劳。随着现代生…

图片8位, 16位,24位,32位原理,以及如何进行补位互转

写在前面:之前一直没有这个概念,以为像素就是十六进制如 #FFFFFF,或者rgb(255,255,255) 即可实现颜色定义,理解相当肤浅,接触到一个物联网项目,写底层的童鞋让我把16位如 0*FFFF转为24位去显示在浏览器&…

美业SaaS系统多门店收银系统源码-【分润常见问题】讲解(二)

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 ▶ 分润常见问题: 4、若产品的服务方分润>0,则销售方分润和服…

考研管理类联考(专业代码199)数学基础【3】函数、方程、不等式

一、函数 1.一次函数 y kx b(k≠0) 的图象及性质 2.二次函数y ax^2 bx c的图象和性质 3.指数函数y a^x ( a>0,且a≠1)的图象和性质 4.对数函数y logₐx ( a>0,且a≠1)的图象与性质 二、方程 1.一元…

大数据和AI在半导体生产系统中的应用

大数据和AI在半导体生产系统中的应用场景非常广泛,涉及从设计、制造到质量控制和市场分析的各个环节。以下是一些具体的半导体大数据应用场景、技术原理、以及实现这些应用的具体做法和方法: 01、半导体大数据应用场景 1. 预测性维护 - **应用场景**:预测设备故障,提前…

android图标底色问题,debug与release不一致

背景 在android 8(sdk 26)之前的版本,直接使用图片文件作为图标,开发时比较容易控制图标,但是不同的安卓定制版本就不容易统一图标风格了。 在android 8及之后的版本,图标对应的是ic_launcher.xml&#x…

充电宝哪个牌子好更耐用?2024年耐用充电宝不能错过

随着科技的进步和智能手机的普及,我们的生活已经与手机紧密相连。然而,手机电量的限制却常常让我们感到焦虑和不安。一旦手机没电,我们就仿佛失去了与外界联系的能力,无法及时接收重要信息、进行导航或支付。为了解决这个问题&…

运放的同相与反相放大

反相放大器 同相端接地,电压为 0,反相端和同相端虚短,因此也是 0 V 的电压,同时由于虚断,几乎没有电流注入,所以R 1 和R 2 相当于串联,电阻上的电流相等 因此可以求出输入输出关系式为 V o u t…

【python数据分析基础】—pandas透视表和交叉表

目录 前言一、pivot_table 透视表二、crosstab 交叉表三、实际应用 前言 透视表是excel和其他数据分析软件中一种常见的数据汇总工具。它是根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。 一、pivot_table 透视表 pivot_tabl…

gitee 简易使用 上传文件

Wiki - Gitee.com 官方教程 1.gitee 注册帐号 2.下载git 安装 http://git-scm.com/downloads 3. 桌面 鼠标右键 或是开始菜单 open git bash here 输入(复制 ,粘贴) 运行完成后 刷新网页 下方加号即可以添加文件 上传文件 下载 教程…

谷底入场,2024年普通人如何布局大健康赛道?_产业_发展_市场

【181、2077、9182】 坐标:厦门,我是易创客运营肖琳 深耕社交新零售行业10年,主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 今天为大家介绍普通人如何布局大健康赛道。 马云曾经说,未来10年能够超越阿里的…

医院预约挂号|基于Springboot+vue的医院预约挂号系统小程序的设计与实现(源码+数据库+文档)

医院预约挂号系统小程序 目录 基于Springboot+vue的医院预约挂号系统小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1小程序端 后台功能模块 4.2.1管理员功能 4.2.2医生功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选…

Py脚本_文件分类

最近发现通过Edge和chrome或者其他浏览器下载的文件都存放在一个地方就很繁琐,于是翻找以前的脚本来归纳这些文件,虽然有IDM下载独有会自动分类,但是相信很多同学都在一个文件里找文件,这次就写个Py脚本来实现这个功能。 # -*- c…

git bash退出vim编译模式

解决方法: 1.按esc键(回到命令模式) 此时是没有分号让我们在后面输入命令的 2.按shift键: 3.再输入:wq,并按enter键 此时我们发现又回到git bash窗口 希望对大家有所帮助!

配置好Maven后本地仓库不自动加载以及创建Maven报错的解决方法

先退出到全局模式再点击All Settings 点击maven 修改Maven home path修改了这个local不同步 点击Flie中的Module 然后选择maven 点击next设置需要存放的位置以及组名 然后报错 报错误的原因是因为maven版本太高和与你使用的IDEA版本不兼容 将maven的版本改为3.6并修改环境变量 …

销毁机密文件你还在用删的吗?文件粉碎了解一下哈!(附自制工具下载)

网管小贾 / sysadm.cc 窗外淅淅沥沥,陶克龙回到闷热的办公室,一屁股坐到了椅子上。 一大早他就接到了组织的秘密联络,他的身份已经暴露,需要尽快撤离。 此时的陶克龙大脑飞快地运转着,他需要从纷繁复杂的思绪中抽丝剥…

对于习惯使用ftp传输的企业,如何寻找最佳的替代方案?

FTP协议广泛应用各行业的文件传输场景中,对于很多企业而言,由于FTP应用获取门槛低、使用普遍,因此,有较为稳定的FTP使用习惯,但即便如此,也不得不面对,FTP应用存在着严重缺陷: 传输效…