数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)

news2024/12/25 23:45:24

数据库管理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_id
    products
      {
         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://www.coloradmin.cn/o/1660791.html

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

相关文章

雪花算法生成全局Id,看这篇就够了

分布式id 雪花算法能够生成一个64位long类型数据,适合做分布式系统的全局标识符,或者分库分表中,同类型数据表的主键 原理探究 雪花算法:以一台服务器为对象,在一毫秒时间内,生成一个自增的long数据特点…

Ps 滤镜:视频

Ps菜单:滤镜/视频 Filter/Video “视频”滤镜子菜单中包含了“NTSC 颜色”和“逐行”两个滤镜。 这两个滤镜都是针对视频和电视播放的特定需求设计的。 “逐行”滤镜主要解决交错视频的视觉问题,而“NTSC 颜色”滤镜则确保色彩在电视播放时的兼容性和准确…

springboot+vue+mysql老年大学会员管理系统+PPT+论文+讲解+售后

现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本老粘大学会员管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

HTML4(二)

文章目录 1 开发者文档2 基本标签2.1 排版标签2.2 语义化标签2.3 行内元素与块级元素2.4 文本标签2.5 常用标签补充 3 图片标签4 超链接标签4.1 跳转页面4.2 跳转文件4.3 跳转锚点4.4 唤起指定应用 5 列表5.1 有序列表5.2 无序列表5.3 自定义列表 6 表格6.1 基本结构6.2 表格标…

如何查看页面对应的Selenium定位参数

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

IO 5.10

在一个进程中,创建一个子线程。 主线程负责:向文件中写入数据 子线程负责:从文件中读取数据 要求使用线程的同步逻辑,保证一定在主线程向文件中写入数据成功之后,子线程才开始运行,去读取文件中的数据#incl…

bean在java中什么意思?这篇文章带你详细了解

bean在java中什么意思?这篇文章带你详细了解 在Java的世界里,你可能会经常听到“Bean”这个词。它听起来像咖啡豆,但实际上与咖啡无关。那么,Java Bean到底是什么呢? 简单来说,Bean是一种特殊的Java类&…

麒麟kylin-v10系统,虚拟机kvm的使用

kvm的使用 虚拟机新建 点击选择对应的iso文件 选择相应的系统 (注意,如果这里没有相应的系统比如:windows,可以直接选择Generic default这是通用默认的意思) 选择cpu 完成即可 等待安装完毕 网络设置-ssh连接 虚拟…

2024.5.10

数据库删除操作 //删除操作的槽 void Widget::on_delbt_clicked() {QString sql;if(ui->idedit->text()NULL){sql "drop Stu";}else{sql QString("delete from Stu where id %1").arg(ui->idedit->text());}QSqlQuery query;if(!query.exe…

看懂这4点,保证让你顺利申请小程序地理位置接口

小程序地理位置接口有什么功能? 通常情况下,我们在开发小程序时,可能会用到获取用户地理位置信息的功能。小程序开发者开放平台的新规定指出,如果没有申请开通微信小程序地理位置接口(getLocation)&#xf…

OSPF虚链路

原理概述 通常情况下,一个OSPF网络的每个非骨干区域都必须与骨干区域通过ABR路由器直接连接,非骨干区域之间的通信都需要通过骨干区域进行中转。但在现实中,可能会因为各种条件限制,导致非骨干区域和骨干区域无法直接连接&#x…

Mysql的关联查询以及语句

一、mysql的连接查询 1、等值连接 这里是三张表的等值连接 select rp.role_id,rp.permission_id from role_permission rp, role r, permission p where rp.role_idr.id and rp.permission_idp.id 2、内连接: 角色:系统管理员 是否拥有权限&#xf…

【JVM】垃圾回收机制(Garbage Collection)

目录 一、什么是垃圾回收? 二、为什么要有垃圾回收机制(GC)? 三、垃圾回收主要回收的内存区域 四、死亡对象的判断算法 a)引用计数算法 b)可达性分析算法 五、垃圾回收算法 a)标记-清除…

ICode国际青少年编程竞赛- Python-3级训练场-if else语句

ICode国际青少年编程竞赛- Python-3级训练场-if else语句 1、 for i in range(9):if Flyer[i].x < Dev.x:Flyer[i].step(Dev.x - Flyer[i].x)else:Flyer[i].step(Flyer[i].x - Dev.x) Dev.step(Dev.y - Item.y)2、 for i in range(6):if Flyer[i].x < Dev.x:# 满足条…

哪里有高清视频素材软件?哪里有视频素材网站?

在这个视觉内容至关重要的时代&#xff0c;高质量的视频素材不仅能够增强信息传递的效果&#xff0c;还能显著提升观众的观看体验。接下来介绍的这些视频素材网站&#xff0c;将为您的创作提供广泛的选择&#xff0c;从本土到国际&#xff0c;满足您不同的需求和偏好。 1. 蛙学…

【Qt 学习笔记】Qt常用控件 | 多元素控件 | List Widget的说明及介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 多元素控件 | List Widget的说明及介绍 文章编号&#x…

Linux -- 日志

一 日志的重要性 在之前的编程经历中&#xff0c;如果我们的程序运行出现了问题&#xff0c;都是通过 标准输出 或 标准错误 将 错误信息 直接输出到屏幕上&#xff0c;以此来排除程序中的错误。 这在我们以往所写的程序中使用没啥问题&#xff0c;但如果出错的是一个不断在运行…

ICode国际青少年编程竞赛- Python-3级训练场-综合练习3

ICode国际青少年编程竞赛- Python-3级训练场-综合练习3 1、 for i in range(10):if i < 2 or i > 7: Flyer[i].step(1) Dev.step(Dev.y - Item[0].y)2、 for i in range(8):if i < 3 or i > 4:Spaceship.turnRight()else:Spaceship.turnLeft()Spaceship.step(i …

YUV中Y颜色模型的采样

YUV的特点 相对于表示颜色的GUI&#xff0c; YUI将亮度&#xff08;用Y表示&#xff09;与色调&#xff08;用U和V表示&#xff09;分开来表示。又因为人类视网膜上的视网膜杆细胞要多于视网膜锥细 胞&#xff0c;说得通俗一些&#xff0c;视网膜杆细胞的作用就是识别亮度&…

举办《Llama3关键技术深度解析与构建Responsible AI、算法及开发落地实战》线上高级研修讲座

举办《Llama3关键技术深度解析与构建Responsible AI、算法及开发落地实战》线上高级研修讲座