数据库管理-第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版本:
image.png

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;

image.png
通过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}}} ]
};

image.png
这里需要注意以下一些限制:

  • 所有表必须有主键
  • 表之间有关联关系的列需要用外键连接
  • JSON关系二元性视图必须包含表中所有主键和唯一约束的列
  • 必须包含_id字段

3 查询视图

SQL方式:

select * from orders_jdv;

image.png

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关系二元性视图可以极大减少文档型数据库的存储冗余问题,是一种颠覆性的数据存储与使用方式,但使用还是有一些限制。
老规矩,知道写了些啥。

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

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

相关文章

win10下,svn上传.so文件失败

问题:win10下使用TortoiseSVN,svn上传.so文件失败 解决:右键,选择Settings,Global ignore pattern中删除*.so,保存即可。

【机器视觉】yolo-world-opencvsharp-.net4.8 C# 窗体应用程序

这段代码是基于 OpenCvSharp, OpenVinoSharp 和 .NET Framework 4.8 的 Windows Forms 应用程序。其主要目的是加载和编译机器学习模型,对输入数据进行推理,并显示结果。 下面是该程序的主要功能和方法的详细总结: 初始化 OpenVINO 运行时核心…

[法规规划|数据概念]金融行业数据资产和安全管理系列文件解析(2)

“ 金融行业在自身数据治理和资产化建设方面一直走在前列。” 一直以来,金融行业由于其自身需要,都是国内开展信息化建设最早,信息化程度最高的行业。 在当今数据要素资产化的浪潮下,除了行业自身自身数据治理和资产化建设方面&am…

set-cookie字段,cookie文件介绍+原理,如何查看cookie文件,在基于http协议服务器的代码实现,cookie存在问题+解决(会话机制)

目录 Set-Cookie 引入 介绍 原理 描述 图解 保存"cookie文件"的方法 内存级 文件级 查看cookie文件 示例 实现 介绍 代码 核心代码 全部代码 示例 cookie存在的问题 介绍 存在的必要性 如何解决 问题梳理 引入 会话机制 -- 解决信息泄漏…

2024年第九届数维杯数学建模A题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

Git与GitHub交互

注册 https://github.com/ 本地库与远程库交互方式 创建本地库并提交文件 创建远程库 在本地库创建远程库地址别名 查看现有远程库地址的别名 git remote -v 创建远程库地址别名 git remote add [别名] [远程地址] 远程路地址位置 示例 成员1推送 git push [别名] [分支…

背包问题(一维数组,二维数组,)分割等和字串

背包问题 0-1背包(i代表的是0到i任取,有不放i状态和放i状态 dp[i][j]表示,背包容量为j,可从i种物品中任选。 价值总和最大是多少!! 确定递推公式 再回顾一下dp[i][j]的含义:从下标为[0-i]的物…

苍穹外卖项目---------收获以及改进(5-6天)

①HttpClient 核心作用:在java编码中发送http请求 第一步:引入依赖 第二步:使用封装一个工具类 package com.sky.utils;import com.alibaba.fastjson.JSONObject; import org.apache.http.NameValuePair; import org.apache.http.client.co…

Web前端一套全部清晰 ⑥ day4 CSS.2 复合选择器、CSS特性、背景属性、标签的显示模式

别人的议论,那是别人的,你的人生,才是你的 —— 24.5.7 一、复合选择器 定义:由两个或多个基础选择器,通过不同的方式组合而成 作用:更准确、更高效的选择目标元素(标签) 1.后代选择…

一篇迟来的未来展望的博客

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 老师布置的任务,叫写一篇博客&…

【RabbitMQ 三】Java客户端开发

本文引用的代码源自《RabbitMQ实战指南》 关键的类和接口主要有Channel、Connection、ConnectionFactory、Consumer等,它们主要的作用如下: Channel:实现AMQP协议层的操作Connection:开启信道(Channel)、注…

java.lang.Exception: Test class should have exactly one public zero-

1.原因 Test方法所在类中,不能存在有参数构造函数,无参构造可以存在。JUnit在运行测试之前,会对测试类做一些初始化和验证工作。对于普通的非参数化测试,JUnit期望测试类有一个无参的公共构造函数,这样它才能够实例化测试类并执行其中的测试方…

Hive Views 视图

Hive Views 视图 在Hive中,视图(Views)是虚拟表,它只包含查询定义,而不包含实际的数据。视图可以简化复杂查询,隐藏数据结构,提供安全性,以及促进数据访问和重用。 创建视图的语法如…

微信小程序相对于H5和原生APP有哪些优势?开发小程序的步骤是什么?

微信小程序是什么? 小程序是小型、轻量级的原生移动应用,你可以使用它们来订餐、预约出租车或支付账单。它们建立在微信平台上,可以通过微信的“小程序”目录进行访问。 与普通应用不同,小程序不需要安装。你可以直接打开并使用…

bfs之八数码

文章目录 八数码解题思路图解举例算法思路 代码CPP代码Java代码 八数码 在一个 33的网格中,1∼8这 8个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如: 1 2 3 x 4 6 7 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一…

Ubuntu 24.04 LTS 安装 touchegg 开启触控板多指手势

文章目录 〇、概述一、安装 touchegg二、安装 gnome-shell 扩展 X11 Gestures三、安装可视化配置工具 touche 〇、概述 之前为了让笔记本支持多指手势,我安装的是 fusuma,安装教程详见 这篇文章 ,考虑到 fusuma 安装过程繁琐且不支持可视化配…

odoo实施之创建行业demo

创建数据库,添加公司数据 选择应用,获取15天免费试用 创建完成 设置客户公司logo 创建用户 更改用户语言 前置条件:配置邮件 开发模式下,额外信息 加载demo数据

git bash各分支修改内容不同但合并后不显示冲突问题

在跟着廖雪峰老师的git学习时,按部就班的执行明后,发现 而不是出现原文的结果 解决方法: 切换位feature分支,再合并 git switch feature1 git merge master 此时我们发现: 后面再跟着原文敲就可以了

基于ambari hdp的kafka用户授权读写权限

基于ambari hdp的kafka用户授权读写权限 版本Kafka 2.0.0添加自定义配置修改admin密码重启kafka授权读取授权写入有效通配符部分举例 版本Kafka 2.0.0 添加自定义配置 authorizer.class.name kafka.security.auth.SimpleAclAuthorizer super.users User:admin allow.everyo…

HDLC协议

目录 1.概念 2.配置 3.HDLC帧结构 4.HDLC帧类型 1.概念 HDLC(High-level Data Link Control)高级数据链路控制位于链路层协议,传输单位是帧,它是一组用于在网络结点间传送数据的协议。其特点是各项数据和控制信息都以比特为单位&#xff…