数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)
数据库管理184期 2024-05-07
- 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)
- 1 JSON需求
- 2 关系型表设计
- 3 JSON关系型二元性视图
- 3 查询视图
- 总结
数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)
作者:胖头鱼的鱼缸(尹海文)
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数据库还是2015年我在尚观的时候,也算是刚刚入行的时候,那时候了解到了MongoDB,当时对比一般的关系型数据库,对其副本分片架构很感兴趣。后面还是在一些项目上,如用于近期数据快速分析、智能客服、用户信息等场景。
在最新版本Oracle Database还叫23c的时候,也就是第130期的时候,我根据官方PPT加上自己理解内容介绍了JSON关系型二元性视图,Oracle JSON Relational Duality Views,这个功能算是颠覆了关系型表和JSON在数据库层面的使用方式,如需查看相关详细介绍请在CSDN、墨天轮、公众号、ITPUB查看相关内容。那时候并没有做什么实验,今天尝试自己整一个简单场景来使用JSON关系型二元性视图。
为了合理的进行实验,我还是安装了23ai Free版本:

1 JSON需求
这里模拟一个订单系统输出:
{"_id" : "12345678","ordertime" : "2024-05-07 09:42:21","customer" : "Cary","details" : [ {"pn" : "98765","pname" : "Laptop mode A","price" : "2000","type" : "computer"},{"pn" : "87654","pname" : "CD A","price" : "40","type" : "music"},]
}
其中:
order: 订单编号
customer: 订单用户
order_time: 订单时间
order_detail: 订单详情
- pn: 商品编号
- pname: 商品名称
- price: 商品价格
- type: 商品分类
2 关系型表设计
分别设计用户表customers、然后是订单表orders、订单详情表order_details、商品表products、商品分类表product_type:

建表并插入一些数据:
--drop tables if exist
drop table order_details purge;
drop table products purge;
drop table product_type purge;
drop table orders purge;
drop table customers purge;--customers
create table customers(customer_id number,customer_name varchar2(20),CONSTRAINT customers_pk PRIMARY KEY(customer_id));
insert into customers values(123456,'Cary');
insert into customers values(234567,'Calvin');
insert into customers values(345678,'Haiwen');
insert into customers values(456789,'Xiaogang');--product_type
create table product_type(type_id number,type_name varchar2(20),CONSTRAINT type_pk PRIMARY KEY(type_id));
insert into product_type values(1234,'computer');
insert into product_type values(2345,'music');
insert into product_type values(3456,'food');
insert into product_type values(4567,'book');--products
create table products(product_id number,product_name varchar2(20),price_number number,type_id number,CONSTRAINT products_pk PRIMARY KEY(product_id),CONSTRAINT products_fk FOREIGN KEY(type_id) REFERENCES product_type(type_id));
insert into products values(98765,'Laptop mode A',2000,1234);
insert into products values(87654,'CD A',40,2345);
insert into products values(76543,'Pork',15,3456);
insert into products values(65432,'Oracle 23ai Document',100,4567);--orders
create table orders(order_id number,order_time timestamp,customer_id number,CONSTRAINT orders_pk PRIMARY KEY(order_id),CONSTRAINT orders_fk FOREIGN KEY(customer_id) REFERENCES customers(customer_id));
insert into orders values(12345678,to_timestamp('2024-05-07 09:42:21','yyyy-mm-dd hh24:mi:ss'),123456);
insert into orders values(12345679,to_timestamp('2024-05-07 09:45:25','yyyy-mm-dd hh24:mi:ss'),234567);
insert into orders values(12345680,to_timestamp('2024-05-07 09:48:01','yyyy-mm-dd hh24:mi:ss'),456789);
insert into orders values(12345681,to_timestamp('2024-05-07 09:51:44','yyyy-mm-dd hh24:mi:ss'),345678);--order_details
create table order_details(sub_id number,order_id number,product_id number,CONSTRAINT od_pk PRIMARY KEY(sub_id),CONSTRAINT od_fk1 FOREIGN KEY(order_id) REFERENCES orders(order_id),CONSTRAINT od_fk2 FOREIGN KEY(product_id) REFERENCES products(product_id));
insert into order_details values(1,12345678,98765);
insert into order_details values(2,12345678,87654);
insert into order_details values(3,12345679,87654);
insert into order_details values(4,12345679,65432);
insert into order_details values(5,12345679,76543);
insert into order_details values(6,12345680,98765);
insert into order_details values(7,12345681,98765);
insert into order_details values(8,12345681,87654);
insert into order_details values(9,12345681,76543);
insert into order_details values(10,12345681,65432);commit;
检查数据:
select o.order_id orderid,c.customer_name customer,o.order_time ordertime,p.product_name pn,p.product_name pname,p.price_number price,pt.type_name type from orders o,customers c,order_details od,products p,product_type pt where o.customer_id=c.customer_id and o.order_id=od.order_id and od.product_id=p.product_id and p.type_id=pt.type_id order by o.order_id;

通过SQL查询传统关系型表的订单信息会有一些问题,会有重复的上层数据,在本案例中就是orderid、customer、ordertime相关信息。(原谅我用了个比较low的方式写SQL,我写SQL的能力确实一般般)
3 JSON关系型二元性视图
CREATE JSON DUALITY VIEW orders_jdv AS
orders @insert @update @delete
{_id : order_id,ordertime : order_time,customers @unnest{cid : customer_id,customer : customer_name},details : order_details[ {subid : sub_idproducts{pn : product_id,pname : product_name,price : price_number, product_type @unnest{typeid : type_id,type : type_name}}} ]
};

这里需要注意以下一些限制:
- 所有表必须有主键
- 表之间有关联关系的列需要用外键连接
- JSON关系二元性视图必须包含表中所有主键和唯一约束的列
- 必须包含_id字段
3 查询视图
SQL方式:
select * from orders_jdv;

MongoDB API&REST:
Oracle现在提供了MongoDB API和REST接口用于操作Oracle数据库中的JSON数据,目前该部分还在摸索之中。
Oracle Database API for MongoDB相关文档可参考官方文档:
https://docs.oracle.com/en/database/oracle/mongodb-api/mgapi/preface.html
更多JSON关系二元性视图的用法及案例可参考官方文档:
https://docs.oracle.com/en/database/oracle/oracle-database/23/jsnvu/preface.html
总结
本期对JSON关系二元性视图做了一个简单案例实操,可以看到使用JSON关系二元性视图可以极大减少文档型数据库的存储冗余问题,是一种颠覆性的数据存储与使用方式,但使用还是有一些限制。
老规矩,知道写了些啥。
相关文章:
数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)
数据库管理184期 2024-05-07 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)1 JSON需求2 关系型表设计3 JSON关系型二元性视图3 查询视图总结 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20…...
刷代码随想录有感(58):二叉树的最近公共祖先
题干: 代码: class Solution { public:TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q){if(root NULL)return NULL;if(root p || root q)return root;TreeNode* left traversal(root->left, p, q);TreeNode* right traversal(r…...
[开发|安卓] Android Studio 开发环境配置
Android Studio下载 Android Studio下载地址 下载SDK依赖 1.点击左上角菜单 2.选择工具 3.打开SDK管理中心 4.下载项目目标Android版本的SDK 配置安卓虚拟机 1.打开右上角的设备管理 2.选择合适的手机规格 3.下载并选择项目目标Android系统 4.点击完成配置 …...
开发 Chrome 浏览器插件入门
目录 前言 一,创建插件 1.创建一个新的目录 2.编写清单文件 二,高级清单文件 1.编写放置右窗口 2.常驻的后台JS或后台页面 3.event-pages 短周期使用 三,Chrome 扩展 API 函数 1.浏览器操作函数 2.内容脚本函数 3.后台脚本函数 4…...
在数字化转型的浪潮中,CBDB百数服务商如何破浪前行?
在信息化时代,传统咨询企业面临着数字化转型的挑战与机遇。如何利用数字化技术提升业务效率、增强客户黏性,成为了行业关注的焦点。云南析比迪彼企业管理有限公司(CBDB)作为云南地区的企业咨询服务提供商,率先与百数展…...
程序员的实用神器
在软件开发的海洋中,程序员的实用神器如同航海中的指南针,帮助他们导航、加速开发、优化代码质量,并最终抵达成功的彼岸。这些工具覆盖了从代码编写、版本控制到测试和部署的各个环节。然而,程序员们通常会有一套自己喜欢的工具集…...
spss 导入数据的时候 用于确定数据类型的值所在的百分比95%是什么意思,数据分析,医学数据分析
在SPSS中,当提及“数据类型的值所在的百分比95%”时,这通常与数据的统计分布或置信区间有关,而不是直接关于数据类型的定义。 导入数据的时候需要定义数据类型,那么根据提供的数据,来定义,有时候ÿ…...
Python进阶之-上下文管理器
✨前言: 🌟什么是上下文管理器? 在Python中,上下文管理器是支持with语句的对象,用于为代码块提供设置及清理代码。上下文管理器广泛应用于资源管理场景,例如文件操作、网络连接、数据库会话等,…...
什么年代了,还在拿考勤说事
最近,看到了某公司的一项考勤规定:自然月内,事假累计超过3次或者累计请假时间超过8小时的,不予审批,强制休假的按旷工处理。 真的想吐槽,什么年代了,还在拿考勤说事,这是什么公司、什…...
泰迪智能科技中职大数据实验室建设(职业院校大数据实验室建设指南)
职校大数据实验室是职校校园文化建设的重要部分,大数据实训室的建设方案应涵盖多个方面,包括硬件设施的配备、软件环境的搭建、课程资源的开发、师资力量的培养以及实践教学体系的完善等。 打造特色,对接生产 社会经济与产业的…...
Qt QThreadPool线程池
1.简介 QThreadPool类管理一个QThread集合。 QThreadPool管理和重新设计单个QThread对象,以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用globalInstance来访问该对象。 要使用其中一个QThreadPool…...
无人机+三维建模:倾斜摄影技术详解
无人机倾斜摄影测量技术是一项高新技术,近年来在国际摄影测量领域得到了快速发展。这种技术通过从一个垂直和四个倾斜的五个不同视角同步采集影像,从而获取到丰富的建筑物顶面及侧视的高分辨率纹理。这种技术不仅能够真实地反映地物情况,还能…...
Window(Qt/Vs)软件添加版本信息
Window(Qt/Vs)软件添加版本信息 文章目录 Window(Qt/Vs)软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…...
工厂模式+策略模式完成多种登录模式的实现
前提 (简单工厂不属于设计模式,而是一种编程思想【抽象一层出来】)工厂方法模式、抽象工厂模式 以上都是为了解耦,如果考虑多个纬度(如需要同时考虑多种电器,多种品牌)则优先考虑抽象工厂。 …...
赋能企业数字化转型 - 易点易动固定资产系统与飞书实现协同管理
在当前瞬息万变的商业环境下,企业如何借助信息化手段提升管理效率,已经成为摆在各行各业面前的紧迫课题。作为企业数字化转型的重要一环,固定资产管理的信息化建设更是不容忽视。 易点易动作为国内领先的企业资产管理服务商,凭借其全方位的固定资产管理解决方案,助力众多企业实…...
Sectigo 通配符SSL证书的优势分析!
Sectigo 通配符证书是一种专为需要保护同一主域名下的多个子域名而设计的安全解决方案。以下是Sectigo通配符证书的主要优势和特点: 1. 域名灵活性:使用通配符(*)符号,一张Sectigo通配符证书即可覆盖一个主域名及其所有…...
nuxt2路由,以及重构以前项目,路由使用
Nuxt.js根据pages目录结构自动生成vue-router模块的路由配置。 配置生成的路由可在.nuxt文件下的router.js文件中查看到,如: export const routerOptions {mode: history,base: /,linkActiveClass: nuxt-link-active,linkExactActiveClass: nuxt-link…...
eureka报错:链接8761被拒绝
eureka报错:链接8761被拒绝 来龙去脉 在idea环境中运行没有问题 我的配置是: server: port: 8001 spring: application: name: registry-server eureka: instance: hostname: localhost client: fetch-registry: false register-with-eureka: false …...
Linux 手动部署JDK21 环境
1、下载包(我下载的是tar) https://www.oracle.com/cn/java/technologies/downloads/#java21 完成后进行上传 2、检查已有JDK,并删除(我原有是jdk8) rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps3、清理掉 profile中的j…...
【c2】编译预处理,gdb,makefile,文件,多线程,动静态库
文章目录 1.编译预处理:C源程序 - 编译预处理【#开头指令和特殊符号进行处理,删除程序中注释和多余空白行】- 编译2.gdb调试:多进/线程中无法用3.makefile文件:make是一个解释makefile中指令的命令工具4.文件:fprint/f…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
