从多表连接视图对比人大金仓和Oracle

1383d26feb3eb7a0220c7ead6b19a4b6.gif

a63faaf5c79d9b30d3c3c9709eea22eb.png

340fb6d7f1f1ba090bc34b29ad2f8758.png

KING BASE

2691aa925acf1bb96a3a1a0d53db7802.png

cbbec1d401307c9d6db782ab46dc7d31.png

信息时代,数据是驱动业务决策和创新的核心资源。然而,随着数据量的不断增加,有效地处理和整合数据的过程变得愈发复杂。这时,多表连接视图悄然走进数据库世界,不仅能够将多个表中的数据整合在一起,更加便捷,同时还以其可更新的特性,为数据管理带来了全新的可能性。

目前,多表连接视图功能在主流数据库中都被支持,但各数据库的功能表现有所不同(如下图)。KingbaseES支持的连接视图功能项和Oracle表现一致,完全兼容Oracle多表连接视图,并且比MySQL支持的功能更多。为此,本文将带您深入探索KingbaseES数据库中的多表连接视图及其可更新性。

7c5c9803a5a7a02b49fda742f58cee69.png

KingbaseES、Oracle和MySQL的功能对比

01

多表连接视图相关概念

多表连接视图是指构建视图的顶层查询引用了多个数据表,通过支持多表连接视图的更新操作,可以实现基于连接视图进行数据表的更新操作(DML),包括插入(INSERT)、更新(UPDATE)和删除(DELETE)。

视图(View)

视图是一种虚拟的表,是从一个或多个基本表中派生的,可以像表一样进行查询和更新操作。对于可更新视图,用户可以通过视图来更新基本表中的数据。

【单表视图】是指视图的查询只涉及单个数据表,如下例子中视图v1的查询中只包含表t1。

18a2c2eef4038ddb22b889264f93cf72.png

【多表视图】是指视图数据映射到多个基表。如下例子中视图v1是由表t1和t2组成,视图v1的数据与t1和t2中数据都存在映射关系。

93742c267ead17a2238a3c4019944c20.png

键保留表(Key-Preserved Table)

如果一个表的主键,是连接结果集的键,则称该表是键值保护的,也可以简单理解为存在一个单向的映射,视图中的每一行数据能唯一映射到基表中的一行数据。键保留表是理解多表连接视图是否可更新的基础,当多表连接视图的基表中存在一个或多个键保留表时,则该视图为可更新视图。

目标基表(Target Base Table)

对于多表连接视图进行更新操作时,会转换为对其中某一个基表的更新操作,实际更新的表称为目标基表。

目标基表与键保留表的关系

目标基表必须为键保留表。

02

多表连接视图背后机制

视图的更新操作

用户可以通多对视图进行更新操作实现对表数据的更新,可以减少编程的工作量,同时隐藏数据表的结构,实现数据对用户间不同的可见性,保证数据安全。对视图执行更新操作,最终会将更新操作(Insert/Update/Delete)重定向到某一个基表,从而实现对于基表的数据更新操作,视图中可能存在多个可以更新的基表(键保留表),每一条DML语句只能作用于一个数据表,本文后续内容主要讨论多表连接视图的更新问题。

视图的可更新性判断

当存在一个或多个键保留表时,我们认为这个视图中的键保留表是可以更新的。为了满足键保留表的条件,查询中不能存在影响查询结果集一一映射关系的子句,如:聚集、分组、集合操作等,这也是存在键保留表的先前条件。

多表视图由于存在不同的JOIN方式,以及连接列主键的不同情形,这时如何判断一个基表为键保留表呢?多表连接视图的可更新性和其查询中的连接方式有很大关系,到底如何判断视图列是否可以更新呢?

简单的等值连接的两表JOIN会存在以下情况

  • 两个表的连接列都不是主键:t1和t2组成视图v1且都不存在主键,则对于视图而言无键保留表。

10c24c03a778baa31b4928f15514cf57.png

  • 两个表的连接列都是主键列:Join类型是全外连接时不存在键保留表。若为左连接,左侧表可能是键保留表,右侧表不是键保留表。

2437a63e68ded629c8ab7bfc5056d6a2.png

若为右连接,同理,只是结论完全相反。若为内连接,视图的每一行能映射到与两个基表中的唯一一行,所以两个表都为键保留表。

0ba17339049b1d249b52061f06b89afe.png

  • 两个表的连接列只有一个是主键列

(1) Join类型是全外连接时不存在键保留表。

(2) Join类型如果为左连接,表T1的连接列不是主键,T2的连接列为主键,如图中组成的视图v1在T1中是可以找到唯一映射行的,满足键保留表的关系,所以T1为键保留表。同理右连接相反。

126cf687be960d3d4a871f01fb6c9758.png

4049a0646c887925535fd16b23e6d53a.jpeg

外连接与可更新视图

多表连接视图的可更新性和其查询中的连接方式有很大关系,因此为了更加准确的判断一个多表连接视图是否支持更新,需要对定义视图的查询进行必要的逻辑等价变换,在消除外连接后判断视图的可更新性。

如何判断视图列是否可以更新

  • 视图的列为直接查询的基表列

  • 更新的视图列必须是键保留表的相关列,即目标表必须为键保留表,最后的图例中只能更新视图中col_a和col_b两个列,另外两个列col_c和col_d是不能被更新的

  • 不可更新连接列

目标基表的选择

当用户对一个视图进行更新(Insert/Update/Delete)时,我们如何进行能知道用户想要操作的真正目标基表呢?

对于单表视图来说只有一个表,所以目标基表是明确的。对于多表视图而言此过程需要根据用户的DML语句的输入来识别目标基表。

  • 首先确认视图存在键保留表

  • 对于INSERT和UPDATE的目标基表如何选择?根据DML的目标列确认目标基表,目标列不能涉及多个表

  • 对于DELETE操作不存在视图的目标列信息,如何选择目标基表呢?选择第一个键保留表作为目标基表

视图重写过程

视图的更新实质上是对于基表的更新,在重写视图过程中涉及到哪些部分需要重写呢?

8254b8e8fe103d6559aa823d70f8daf6.png

视图所有表达式的引用关系都需要重定向为对目标基表的引用。若目标基表是视图(嵌套视图),则需要合并嵌套视图的查询到上层查询当中。

对于单表视图的with check option,可以合并到WHERE条件中;而对于多表视图,非目标基表的条件对更新操作而言并无作用,所以只需要提取目标基表的条件即可。

03

数据管理绝佳之选

多表连接视图实用示例与优势

在以下示例中视图emp_dept由表emp和dep组成,列deptno为表dep的主键,emp为键保留表,此视图为可更新的视图。

c88f6a0ef06594bdda0a00c82de5c6e9.png

9b63e48133a9cfb0d9def833721628ae.jpeg

如果我们无法通过连接视图直接进行更新操作,则需要编写一个更为复杂的SQL语句,并且要求对基表dep和emp有足够权限。示例如下:

c80ec0d83787c3aa5219544cfae33160.png

总结

多表连接视图支持可更新是一种非常有用的技术,可以屏蔽复杂的数据操作逻辑,使得数据管理变得更为简单和高效,不会因DML行为而暴露基础表,同时也限制了用户的访问范围和权限,保护数据的安全性和隐私性。因此也被广泛应用于各种数据库系统和数据管理应用中。

正如我们在本文中所探讨的,多表连接视图不仅是数据的魔法,更是我们应对数据复杂性的有力工具。作为数据库领域国家队,人大金仓将积极探索更高效、更智能的数据管理方法,释放数据的无限力量!

4ea62b94d499cbe246212c0e79d64bb0.png供稿:产品研发中心

编辑:王堇

审核:日尧

af463ef7acd2749af10ee2209f5beea9.gif

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

memset和bzero性能分析

首先,我们需要了解bzero和memset的功能。bzero是一个非标准函数,用于将一块内存区域的内容设置为0。它的原型如下:void *bzero(void *s, size_t n);其中,s是要设置的内存区域的起始地址,n是要设置的字节数。memset是一…

C++虚函数(定义,作用,原理,案例)

一.定义: C的虚函数是在父类(基类)中声明的的函数,它可在子类(派生类)中重写。二.作用 虚函数的目的是实现多态性,即在程序运行时根据对象的实际类型确定调用哪个函数。三.使用方法: 在基类中声明虚函数时,需要在函…

分组表,分桶表

1,启动Hive服务 (1)启动HiveServer2服务 nohup hive --service metastore &(2)启动Metastore服务 nohup hive --service hiveserver2 &(3)查看进程信息 lsof -i:100002,…

037、目标检测-SSD实现

之——简单实现 目录 之——简单实现 杂谈 正文 1.类别预测层 2.边界框预测 3.多尺度输出联结做预测(提高预测效率) 4.多尺度实现 5.基本网络块 6.完整模型 杂谈 原理查看:037、目标检测-算法速览-CSDN博客 正文 1.类别预测层 类别…

JavaScript实现飞机发射子弹详解(内含源码)

JavaScript实现飞机发射子弹 前言实现过程源码展示源码讲解HTML结构CSS结构js结构 前言 文本主要讲解如何利用JavaScript实现飞机发射子弹,实现过程以及源码讲解。实现效果图如下: 实现过程 首先,找到飞机和子弹的UI图,gif图最…

五个必知的速率限制策略,以最大化流量流动

速率限制是一种策略,我们在工作中常常使用,它定义了系统在设定的时间框架内可以处理的最大请求数量。 速率限制定义了系统在指定时间段内可以处理的最大请求数量。 Image.png 速率限制是一种策略,我们在工作中常常使用,它定义了…

html综合笔记:设计实验室主页

1 主页来源及效果 Overview - Lab Website Template docs (gitbook.io) greenelab/lab-website-template: An easy-to-use, flexible website template for labs (github.com) 2 创建网页 3 主要的一些file 3.1 index.md 主页面 3.1.1 intro 3.1.2 highlight …

斯坦福机器学习 Lecture2 (假设函数、参数、样本等等术语)

假设函数定义 假设函数,猜一个 x->y 的类型,比如 y ax b,随后监督学习的任务就是找到误差最低的 a 和 b 参数 有时候我们可以定义 x0 1,来让假设函数的整个表达式一致统一 如上图是机器学习中的一些术语 额外的符号&#xf…

《视觉SLAM十四讲》-- 回环检测

文章目录 10 回环检测10.1 概述10.1.1 回环检测的意义10.1.2 回环检测的方法10.1.3 准确率和召回率 10.2 词袋模型10.3 字典10.3.1 字典的结构10.3.2 实践:创建字典 10.4 相似度计算10.4.1 理论部分10.4.2 实践:相似度的计算 10.5 实验分析与评述 10 回环…

PCL 计算一条射线与一个三角形的交点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里我们使用点向式分别表示一个射线与一个三角形,如下图所示: 其中,平面的法向量 N N N可以由三角形两条边的叉乘来计算,点R0到平面的法向距离

Linux(Ubuntu)安装JDK环境

系统环境 Ubuntu20.04 下载JDK压缩包 前往Oracle官网进行后续下载或单击下载JDK压缩包 下拉找到JDK8,在Linux板块下选择适配系统架构的压缩包文件(后缀为tar.gz),系统架构可通过uname -m命令查看 安装JDK 安装环境通常放在/usr/local下,进入…