通过几个基本概念说一下为什么openGauss是当下之选?

news2025/2/3 10:02:49

Database、Schema、User都是数据库的基本概念,SQL标准中也有明确规范。但不同数据库的具体实现也不尽相同,有些甚至大相径庭。这就导致用户在做国产化选型和数据库迁移时可能会遇到种种困难。本文从这几个基本概念展开,说说为什么openGauss系数据库是国产数据库替换的当下之选。

同事的问题

今天有个同事问了我一个问题:
在这里插入图片描述

这位同事之前是搞MySQL的,对Oracle不甚了解。我们先来看看这两个图:

在这里插入图片描述

图1就是Oracle DBA经常用到的静态数据字典视图dictionary,可以查询数据库中所有的表和视图及其注释。我本人也经常模糊查询dictionary视图找到完整的表名。

在这里插入图片描述

图2的内容就有点陌生了。经验丰富的Oracle DBA应该很容易做出判断。图2会话应该并非使用sys登录的,恰好这个用户下有个同名的对象dictionary。

问题本身并不复杂,但却体现了不同数据库对这些基本概念实现上的差异。我借此机会整理一下Oracle、MySQL、openGauss这几个主流数据库在Database、schema、user这几个概念上的差异,也分享一下这些差异在国产数据库替换方面的影响。

概念说明

Database,是一个有组织的数据单元。这个概念所有数据库都是一致的。三家并无太大的不同。

Schema,是一个命名的数据库对象的集合,是一个逻辑范畴。如果把数据库比喻成一个大楼,那schema可以认为是每个房间。每个房间都可以配置自己的物品。也就是每个schema都可以有自己的表、视图、索引这些对象。

User,数据库中的用户,也就是数据的使用者。就如同进入大楼的人,可以进入自己的房间,也可以进入被授权的其它房间。

数据库中的所有对象(表、视图等)都是在这三个概念下组织起来的。具体组织方式则各不相同。

openGauss

openGauss源于PostgreSQL,而PostgreSQL又被称为学院派数据库,一板一眼的按规范完全实现了这些概念:

在这里插入图片描述

上图可知openGauss中用户独立于数据库之外,不属于数据库的一部分。数据库管理员登录到数据库创建用户时,openGauss自动在数据库中创建一个与用户名同名的schema。

vastbase=# create user appuser with password 'Password#0000' login;
CREATE ROLE
vastbase=# \dn
          List of schemas
          Name           |  Owner   
-------------------------+----------
 appuser                 | appuser
 ...

登录的用户可以通过set search_path命令切换有权限的其它schema,并创建对象:

vastbase=# set search_path=appuser;
SET
vastbase=# show current_schema;
 current_schema 
----------------
 appuser
(1 row)
vastbase=# create table zqhtest_1125(id number,name varchar2(20));
CREATE TABLE

当需要更多schema时,可以通过create schema命令创建:

vastbase=# create schema appuser2;
CREATE SCHEMA
vastbase=# 
vastbase=# set search_path=appuser2;
SET
vastbase=# create table zqhtest_1125(id number,name varchar2(20));
CREATE TABLE

可以看到不同schema下面可以创建同名的对象,所以说schema又叫namespace。是一个命名空间,不同schema下可以创建同名对象。

值得一提的是openGauss创建schema的语法也与SQL规范完全兼容,下面的截图来自Vastbase官方文档:

CREATE SCHEMA AUTHORIZATION user_name [ schema_element [ ... ] ];

Oracle

Oracle的实例在其生命周期内只能打开一个数据库,无法在一个实例下创建多个数据库,自然user也就没法独立于数据库之外。所以Oracle将user设计成了数据库的一部分,同时允许在一个数据库内创建多个user。

图片

当用户被创建时Oracle会自动为其创建同名的schema,这一点是与openGauss一致的。

Oracle也可以在用户不变的情况下切换schema,但几乎没有人这么用:

图片

可以看到用户名还是sys,但schema已经变了。之所以没有人切换schema,是因为Oracle不能脱离用户单独创建传统意义上的schema,也就是说用户名和schema必须是一一对应的。

读者可能注意到了,我上面说的是Oracle不能创建“传统意义“上的schema。这是因为Oracle为schema引入了新的内涵。查阅官方文档可知Oracle同样支持create schema语法:

在这里插入图片描述

Oracle的解释是这样的:

Use theCREATE SCHEMA statement to create multiple tables and views and perform multiple grants in your own schema in a single transaction.

To execute aCREATE SCHEMA statement, Oracle Database executes each included statement. If all statements execute successfully, then the database commits the transaction. If any statement results in an error, then the database rolls back all the statements.

没错!这根本与我们说的schema不是一个概念。Oracle相比其它数据库一直有个不足:DDL是隐式提交的,不支持回滚。所以Oracle使用这个create schema语句解决了DDL回滚的问题,将DDL放到schema中就实现回滚。

这样既实现了SQL规范,又实现了DDL回滚的功能。

MySQL

MySQL的user也是独立于数据库之外的:

在这里插入图片描述

但在Schema方面MySQL跟Oracle走了两个相反的方向,它把schema和database合起来了。

下图来自MySQL官方文档:

在这里插入图片描述

而且文档也做了说明:

CREATE DATABASE creates a database with the given name. To use this statement, you need the CREATE privilege for the database. CREATE SCHEMA is a synonym for CREATE DATABASE.

Create schema就是Create Database的同义词,在MySQL中是完全相同的。所以在MySQL中无法创建与数据库名相同的schema:

在这里插入图片描述

2021年有个客户做国产化替代工作,将MySQL中的数据库一对一的迁移到了openGauss,结果应用中的跨数据库的两表关联查询无法支持了。找我们协助我才知道MySQL竟然支持跨数据库关联查询。这在Oracle DBA和openGauss DBA眼里是多么离谱的功能!

我查阅了MySQL的官方文档看了上面的语法解释才豁然明白,其实本质上也就是两个schema关联查询。

MySQL这样设计的弊端就是同一个数据库下无法创建同名对象了,比如:

图片

这是显而易见的,因为只有一个schema。用户只能为每个业务创建单独的database,所以MySQL DBA管理的数据库数量都特别多。

总结

相对于这些大众普遍熟知的概念和SQL规范,MySQL和Oracle都有所偏离。

Oracle将user和schema合并了。而create schema命令的行为与创建传统意义的schema完全是风马牛不相及。因为不能脱离user单独创建schema,所以Oracle里要创建更多的user。

MySQL将Database和schema合并了,create schema其实就是create database的同义词。这在一定程度上降低了使用难度,但与其它数据库兼容性变差。跨数据库关联查询和同一个数据库中不能有同名对象这些行为在Oracle和openGauss/PostgreSQL的用户看来是如此的离谱。

openGauss源于PostgreSQL,也继承了PostgreSQL学院派风格,完整的实现了SQL规范。所以也就有更多灵活性和兼容性。替代Oracle时因为user和schema都是对应的,所以不需要做更多的转换。替换MySQL时可以将每个database迁移到openGauss的schema中。

可以这样说:openGauss是当下国产化数据库替代的最佳选择。

本文作者:传奇队长
转自:高斯茶话会

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

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

相关文章

YACS(上海计算机学会竞赛平台)三星级挑战——两数之和

题目描述 给定 n 个整数 a[1]​,a[2]​,⋯,a[n]​,并且保证 a[1​]≤a[2​]≤⋯≤a[n]​ 再给定一个目标值 t,请判断能否找到 a[i]​ 与 a[j]​,ai​aj​t 且 i≠j。 输入格式 第一行:单个整数n; 第二行&#xf…

JavaScript高级 构造函数与原型篇

构造函数与原型 1、构造函数 构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。 // 定义学生构造函数func…

数字图像处理-空间域图像增强-爆肝18小时用通俗语言进行超详细的总结

目录 灰度变换 直方图(Histogram) 直方图均衡 直方图匹配(规定化) 空间滤波 低通滤波器 高通滤波器 ​​​​​​​ 本文章讲解数字图像处理空间域图像增强,大部分内容来源于课堂笔记中 灰度变换 图像增强&…

SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…

找不到msvcp120dll,无法继续执行代码的解决方法大全

当你尝试启动一个应用程序或游戏,并且遭遇到一个错误信息,告诉你“找不到msvcp120dll,无法继续执行代码”或者收到类似的提示,这说明你的操作系统中缺失了一个关键的动态链接库文件,即 msvcp120.dll。这种情况其实并不罕见&#x…

Java开发框架和中间件面试题(3)

14.Spring事务中的隔离级别有哪几种? 在TransactionDefinition接口中定义了五个表示隔离级别的常量: 1⃣️ISOLATION DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的可重复读隔离级别;Oracle默认采用的读已提…

智能优化算法应用:基于金鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于金鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于金鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金鹰算法4.实验参数设定5.算法结果6.参考文献7.MA…

深入理解 JavaScript 函数:提升编程技能的必备知识(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

python/C 生成beta分布的随机数

python/C 生成beta分布的随机数 文章目录 python/C 生成beta分布的随机数前言一、beta分布理论知识二、python 生成服从beta分布的随机数三、C语言生成服从beta分布的随机数 前言 想把一个算法用C语言实现,其中涉及到了beta分布取随机数,记录一下结果 一…

JOSEF约瑟 零序电流互感器DH-30L DH-70L 配套DJ-ZB1漏电继电器使用

系列型号 DH-16L型配套用零序(剩余)电流互感器DH-20L型配套用零序(剩余)电流互感器 DH-23L型配套用零序(剩余)电流互感器DH-30L型配套用零序(剩余)电流互感器 DH-45L型配套用零序&am…

【Linux笔记】文件查看和编辑

🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 前言 命令 cat (Concatenate and Display): more 和 less: nano 和 vim (文本编辑器): 结语 我的其他博客 前言 学习Linux命令行和文件…

测试框架|Burp Suite几个基本工具的使用

前阵子项目上想通过测试工具在网页上模拟返回错误代码 500 来查看页面的错误处理,然后去调查了下 burp suite,看了些基本工具的使用文档。虽然最后证实 burp suite 只能用来处理页面测试应用程序的实际行为和响应,而不是尝试模拟不存在的问题…

大数据求职心得

........................................................................................................................................................... 大数据求职心得 ...................................................................................…

GCC:GNU编译器

GCC(GNU Compiler Collection)是一款广泛使用的开源编译器套件,支持多种编程语言,包括C、C、Objective-C、Fortran、Ada和Go等。在本文中,我们将通过一个简单的C程序来介绍GCC的编译过程,包括预处理、编译、…

HrSegNet 23年裂缝检测新文章基于PaddelPaddle和Paddleseg的复现

本文章是对2023年发表在Automation in Construction上论文 Real-time High-Resolution Neural Network with Semantic Guidance for Crack Segmentation 的复现。 我参考了作者上传至github的代码,并得到了作者的帮助。https://github.com/CHDyshli/HrSegNet4Cra…

4G微型RTU如何实现冬季工业管网远程监测

随着我国北方全面进入到冬季,多日以来严寒、降雪天气频发,工业基础设施也迎来冬季考验。对于一些输送化工原料、油气和给排水等用途的工业管网设施,在面临极端冰雪天气时易产生各种风险,诸如管道水/气泄漏损耗、低温冻裂、积雪压塌…

DBdoctor,MySQL 性能问题终结者

本文 5542 字,读完大约需要 8 分钟(文末有惊喜 License!) 17(一起),这是我的幸运数字,恰巧今年 8 月 17 日在 DTCC 大会上我们全网首次发布 DBdoctor 数据库性能诊断软件(简称 DBdoctor&#x…

pake协议传输文件magic-wormhole

pake协议传输文件magic-wormhole 1 magic-wormhole简介其他介绍 2 安装magic-wormhole3 使用示范发送文件指定虫洞码长度 接收文件 1 magic-wormhole简介 16.7k star 强推,丝滑、简洁、安全的开源工具——magic-wormhole 项目地址:https://github.com/…

Debug

0、Debug的步骤 Debug(调试)程序步骤如下: 1、添加断点 2、启动调试 3、单步执行 4、观察变量和执行流程,找到并解决问题 1、添加断点 在源代码文件中,在想要设置断点的代码行的前面的标记行处,单击鼠标左键就可以设置断点&…

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据

1.File(操作文件本身) 1.定义 目录 2.常用方法 3.路径引用符 可以用/或者\\分隔路径 还可以用File.separator分隔路径,会根据不同系统使用啥分隔符。 4.绝对路径、相对路径及桌面路径表示 桌面路径为: 我电脑的用户名为X 5.示例…