数据库管理-第130期 JSON二元性(20240109)
数据库管理130期 2024-01-09
- 第130期 JSON二元性(20240109)
- 1 简介
- 2 关系型表和JSON存储的优劣
- 3 Oracle JSON关系型二元性视图
- 总结
第130期 JSON二元性(20240109)
上周,又双叒飞了一趟上海,也是2024年第一飞,主要是受德哥邀请参加《国产数据库共话未来趋势·第三期-数据库实践哪家强》第一次当主持人(紧张的一批,嘴瓢了好几次),同时进行了《国产数据库最大的敌人》的主题分享,从Oracle的营收与研发投入展现Oracle的强大,同时从Oracle 23c新特性JSON二元性来展现Oracle的创新能力。(视频回放可以关注微信视频号“digoal德哥PostgreSQL”进行查看)

1 简介
本期就来稍微深入的讲一下JSON二元性,其实这个是去年Oracle 23c新特性探索连更那几篇遗留的一项内容,主要是我在SQL和开发这块确实比较烂,那时候就跳过了JSON二元性这个特性。在CAB/PAB,Oracle通过一个非常直观的栗子讲解了这一特性,我也很荣幸要到了对应的PPT并进行了翻译,在本次大会上进行了分享。
Oracle JSON关系型二元性视图,Oracle JSON Relational Duality Views,简称JSON二元性(官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/23/jsnvu/overview-json-relational-duality-views.html)。其实简单点来说就是依然用关系型表用行列方式存放数据,而通过视图来将表映射成JSON模型,并可以通过传统JSON数据库方式来通过这个视图来操作对应数据。
下面我们以一个栗子,搭建并维护一个学生课表APP来展示JSON二元性这一新特性:

2 关系型表和JSON存储的优劣
关系型表的存储设计其实比较简单,可以实现存储独立性、数据一致性还是查询便捷性:

通过四表JOIN即可获取需要的结果,但是通过SQL会出现输出结果的重复数据,增加业务侧对数据的处理:

而JSON存储,对于业务程序来说可以做到几乎是拿来即可展示:

在Oracle 23c出现之前,为了在关系型数据库中存放JSON信息,很多数据库,比如Oracle、MySQL、PostgreSQL等已经将JSON作为一种原生数据类型引入数据库中,即将JSON数据存放在列中。但是JSON文档存储也有一些问题,比如数据冗余的问题:

即多条数据存在相同的内容会出现数据的冗余(这个栗子中就是多个学生有相同的课程),同时如果需要对该条数据进行更新,需要对所有关联数据进行操作(比如某个课程需要换老师或教室),增加了更新的开销和风险。
3 Oracle JSON关系型二元性视图
从Oracle 23c开始Oracle提供了一个存储模型存放所有类型数据的方案,在Oracle眼中数据是以存储为中心,而不是以使用为重,数据的存储模型决定了数据的一切使用方式,包括操作、语言和API:

JSON关系型二元性视图声明意图将关系型数据作为JSON文档使用,允许数据库使用关系型表生成JSON格式和API:

这个栗子中JSON二元性相关语句如下:
CREATE JSON DUALITY VIEW student_schedule
AS student
{{student : stuidname : snamemajor : majorschedule : student_courses[ {course{time : timecourse : cnamecourseId : cidroom : room teacher @unnest{teacher : tname}}} ]
};


通过JSON关系型二元性视图,将关系型表映射成JSON格式,APP可以使用标准的REST来从视图中GET获取JSON文档,视图同样可以通过MongoDB兼容API或SQL进行访问:

GET school.edu/student_sched?q={"student":{"$eq":"Jill"}}
也可以使用PUTs、MongoDB兼容API或SQL来通过视图编辑文档,数据库检测对文档的变更并且实时更新关系表中的数据:

PUT school.edu/student_schedule/:stuid
JSON二元性允许JSON文档包含任何对应用方便的数据,JSON关系型二元性视图因为底层标准关系型行模式存储,因此永远不会出现冗余数据,相较于JSON数据库,二元性为应用提供了更好的JSON使用及存储方式:

另一方面使用JSON二元性功能不需要像传统JSON数据库那样,针对每一种功能设计独立的JSON模型,通过一套关系型表底层可以实现多种JSON模型映射以实现不同的功能,从而降低数据底层逻辑设计难度,提升数据使用便捷性:

同时,基于关系型表底层可以充分发挥关系型数据库在OLTP的性能优势,并提供更加便捷多元化的分析方式,还可以通过数据库的自动并行进一步提升性能:

总结
Oracle 23c新特性JSON关系型二元性视图给数据库提供了全新的数据存储与使用思路,同时进一步阐释并践行了Oracle融合数据库的理念。
老规矩,知道写了些啥。
相关文章:
数据库管理-第130期 JSON二元性(20240109)
数据库管理130期 2024-01-09 第130期 JSON二元性(20240109)1 简介2 关系型表和JSON存储的优劣3 Oracle JSON关系型二元性视图总结 第130期 JSON二元性(20240109) 上周,又双叒飞了一趟上海,也是2024年第一飞…...
k8s--动态pvc和pv
前情回顾 存储卷: emptyDir 容器内部,随着pod销毁,emptyDir也会消失 不能做数据持久化 hostPath:持久化存储数据 可以和节点上目录做挂载。pod被销毁了数据还在 NFS:一台机器,提供pod内容器所有的挂载点…...
C++:常量
const的最初动机 const的使用方法 使用const的好处是允许指定一种语义上的约束,即某种对象不能被修改,且由编译器具体实施这种约束。 const声明格式:const 类型名 对象名;修饰普通变量,时期不能被随意修改 【注意】1.C中的const…...
java JDBC 连接数据库
必须先插入工具包 DataSource ds JdbcHelper.getDs();System.out.println(ds);JdbcTemplate jdbcTemplatenew JdbcTemplate(ds);System.out.println(jdbcTemplate);//新增String sql1"insert into biao values(null,?,?,?)";int ijdbcTemplate.update(sql1,"…...
图神经网络|5.消息传递的计算方法 6.多层GNN的作用
5.消息传递的计算方法 边的存放方式 注意,在实际的边的实现方式中,并不是以邻接矩阵来进行实现的,这是因为在图的更新中,用邻接矩阵进行更新所占用的时间开销相对大,二是因为领接矩阵占用的空间大(N方&am…...
构建中国人自己的私人GPT
创作不易,请大家多鼓励支持。 在现实生活中,很多人的资料是不愿意公布在互联网上的,但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢?于是我们构建自己或公司的私人GPT变得非常重要。 先看效果 一、…...
添加气泡与菜单
目录 1、添加气泡 1.1、文本提示气泡 1.2、带按钮的提示气泡 1.3、自定义气泡 2、菜单 2.1、创建默认样式的菜单 2.2、创建自定义样式的菜单 1、添加气泡 Popup属性可绑定在组件上显示气泡弹窗提示,设置弹窗内容、交互逻辑和显示状态。主要用于…...
python代码练习:双指针法
题目一:移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不…...
C++系列十七:访问控制符
访问权限控制符 一、public访问权限二、private访问权限三、protected访问权限 在C中,访问权限控制符用于限制类成员的访问权限,主要包括public、private和protected三种。这些访问权限控制符用于控制类成员的访问级别,从而保证数据的封装性和…...
postgresql 最简主从配置
实验目的 配置一个最简的主从环境,了解基本的主从配置。 环境参数 操作系统CentOS Linux release 7.9.2009 (Core)数据库版本PostgreSQL 10.23主库端口15431备库端口15432 因为只是做实验,所以主备库放在同一台机器上,仅通过端口区分主备…...
ubuntu 安装 anaconda
ubuntu 安装 anaconda 下载 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh安装 bash Anaconda3-2023.09-0-Linux-x86_64.sh2.1 回车继续 2.2 许可协议 输入 q 退出阅读许可协议 2.3 输入 yes 接受 许可协议 2.4 设置 anaconda 安装位置 如不需…...
DOM 被劫持
文档对象模型(DOM)充当着 HTML 和 JavaScript 之间的接口,搭建起静态内容与动态交互之间的桥梁,对现代 Web 开发而言,DOM 的作用不可或缺。 然而,DOM 也有一个致命的陷阱 —— DOM 劫持。DOM 劫持是指当 H…...
PIG框架学习2——资源服务器的配置详解
一、前言 1、pig资源服务器的配置 Spring Security oauth2相关的依赖是在pigx-common-security模块中引入的,其他模块需要进行token鉴权的,需要在微服务中引入pigx-common-security模块的依赖,从而间接引入相关的Spring security oauth2依赖…...
vue+element ui实现图片上传并拖拽进行图片排序
用到的技术栈: vue2element Uivue-dragging 如何使用: 第一步: 安装 npm install awe-dnd --save第二步: 引入 main.js 文件 // 引入组件 import VueDND from awe-dnd // 添加至全局 Vue.use(VueDND)具体项目代码 <el-form-item label"封面…...
国产服务器 BIOS下组建RADI不同RAID卡-超详细
国产服务器 长城 组建Raid的方法 说明 大多数国产服务器通用型服务器进入BIOS的都是按DEL键。 9361RAID卡组建方法 在服务器启动过程中,按下DEL键进入BIOS界面。 进入设备管理器,选择AVAGO MegaRAID页签。 3. 进入RAID卡设备,选择Main Me…...
UE4 4.21-4.27使用编辑器蓝图EditorBlueprint方法
在UE4 4.21中,编辑器蓝图(Editor Blueprint)是一个强大的工具,允许开发者扩展和自定义Unreal编辑器的功能。通过编辑器蓝图,我们可以创建自定义的工具和功能,以优化开发流程。 本教程将指导您如何在UE4 4.…...
105、Zero-1-to-3: Zero-shot One Image to 3D Object
简介 官网 使用合成数据集来学习相对摄像机视点的控制,这允许在指定的摄像机变换下生成相同对象的新图像,用于从单个图像进行三维重建的任务。 实现流程 输入图像 x ∈ R H W 3 x \in \R^{H \times W \times 3} x∈RHW3,所需视点的相…...
scala 安装和创建项目
Scala,一种可随您扩展的编程语言:从小型脚本到大型多平台应用程序。Scala不是Java的扩展,但它完全可以与Java互操作。在编译时,Scala文件将转换为Java字节码并在JVM(Java虚拟机)上运行。Scala被设计成面向对…...
Python办公自动化 – 自动化文本翻译和Oracle数据库操作
Python办公自动化 – 自动化文本翻译和Oracle数据库操作 以下是往期的文章目录,需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自…...
如何在Win10电脑接收苹果手机日程提醒呢?
有很多小伙伴手机使用的是iPhone苹果手机,但办公电脑使用的win10系统的电脑,这时候如果想要在win10电脑上同步接收苹果手机上设置的日程提醒,该怎么操作呢?如何在win10电脑接收苹果手机日程提醒呢? 如果你设置的日程提…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
