openGauss5 企业版之开发设计规范

news2024/11/25 4:33:15

文章目录

  • 1.数据库对象命名
  • 2. Database和Schema设计
    • 2.1 Database设计建议
    • 2.2 Schema设计建议
  • 3. 表设计
    • 3.1选择存储方案
    • 3.2 选择分布方案
    • 3.3 选择分区方案
    • 3.4 选择分布键

在这里插入图片描述

1.数据库对象命名

数据库对象命名需要满足约束:

  • 标识符非时序表长度不超过63个字节,时序表(当前特性是实验室特性,使用时请联系华为工程师提供技术支持)长度不超过53个字符。

  • 标识符以字母或下划线开头,中间字符可以是字母、数字、下划线、$、#。

  • 若标识符被双引号(“”)包含,则可以使用合法字符的任意组合,如"123gs_column"。

  • 标识符不区分大小写,只有被双引号包含才区分大小写。

  • 【建议】避免使用保留或者非保留关键字命名数据库对象。

说明: 可以使用select * from pg_get_keywords()查询openGauss的关键字,或者在关键字章节中查看。

  • 【建议】避免使用双引号括起来的字符串来定义数据库对象名称,除非需要限制数据库对象名称的大小写。数据库对象名称大小写敏感会使定位问题难度增加。

  • 【建议】数据库对象命名风格务必保持统一。

增量开发的业务系统或进行业务迁移的系统,建议遵守历史的命名风格。
建议使用多个单词组成,以下划线分割。
数据库对象名称建议能够望文知意,尽量避免使用自定义缩写(可以使用通用的术语缩写进行命名)。例如,在命名中可以使用具有实际业务含义的英文词汇或汉语拼音,但规则应该在数据库实例范围内保持一致。
变量名的关键是要具有描述性,即变量名称要有一定的意义,变量名要有前缀标明该变量的类型。

  • 【建议】表对象的命名应该可以表征该表的重要特征。例如,在表对象命名时区分该表是普通表、临时表还是非日志表:

    普通表名按照数据集的业务含义命名。
    临时表以“tmp_+后缀”命名。
    非日志表以“ul_+后缀”命名。
    外表以“f_+后缀”命名。
    不创建以redis_为前缀的数据库对象。
    不创建以mlog_和以matviewmap_为前缀的数据库对象。
    
  • 【建议】非时序表对象命名建议不要超过63字节。如果过该长度内核会对表名进行截断,从而造成和设置值不一致的现象。且在不同字符集下,可能造成字符被截断,出现预期外的字符。

2. Database和Schema设计

openGauss中可以使用Database和Schema实现业务的隔离,区别在于Database的隔离更加彻底,各个Database之间共享资源极少,可实现连接隔离、权限隔离等,Database之间无法直接互访。Schema隔离的方式共用资源较多,可以通过grant与revoke语法便捷地控制不同用户对各Schema及其下属对象的权限。

从便捷性和资源共享效率上考虑,推荐使用Schema进行业务隔离。
建议系统管理员创建Schema和Database,再赋予相关用户对应的权限。

2.1 Database设计建议

  • 【规则】在实际业务中,根据需要创建新的Database,不建议直接使用数据库实例默认的postgres数据库。
  • 【建议】一个数据库实例内,用户自定义的Database数量建议不超过3个。
  • 【建议】为了适应全球化的需求,使数据库编码能够存储与表示绝大多数的字符,建议创建Database的时候使用UTF-8编码。
  • 【关注】创建Database时,需要重点关注字符集编码(ENCODING)和兼容性(DBCOMPATIBILITY)两个配置项。openGauss支持A、B、C和PG四种兼容模式,分别表示兼容O语法、MY语法、TD语法和POSTGRES语法,不同兼容模式下的语法行为存在一定差异,默认为A兼容模式。
  • 【关注】Database的owner默认拥有该Database下所有对象的所有权限,包括删除权限。删除权限影响较大,请谨慎使用。

2.2 Schema设计建议

  • 【关注】如果该用户不具有sysadmin权限或者不是该Schema的owner,要访问Schema下的对象,需要同时给用户赋予Schema的usage权限和对象的相应权限。
  • 【关注】如果要在Schema下创建对象,需要授予操作用户该Schema的create权限。
  • 【关注】Schema的owner默认拥有该Schema下对象的所有权限,包括删除权限。删除权限影响较大,请谨慎使用。

3. 表设计

openGauss的数据分布在各个DN上。总体上讲,良好的表设计需要遵循以下原则:

  • 【关注】将表数据均匀分布在各个DN上。数据均匀分布,可以防止数据在部分DN上集中分布,从而导致因存储倾斜造成数据库实例有效容量下降。通过选择合适的分布列,可以避免数据倾斜。
  • 【关注】将表的扫描压力均匀分散在各个DN上。避免扫描压力集中在部分DN上,而导致性能瓶颈。例如,在事实表上使用等值过滤条件时,将会导致扫描压力不均匀。
  • 【关注】减少需要扫描的数据量。通过分区表的剪枝机制可以大幅减少数据的扫描量。
  • 【关注】尽量减少随机I/O。通过聚簇/局部聚簇可以实现热数据的连续存储,将随机I/O转换为连续I/O,从而减少扫描的I/O代价。
  • 【关注】尽量避免数据shuffle。shuffle,是指在物理上,数据从一个节点,传输到另一个节点。shuffle占用了大量宝贵的网络资源,减小不必要的数据shuffle,可以减少网络压力,使数据的处理本地化,提高数据库实例的性能和可支持的并发度。通过对关联条件和分组条件的仔细设计,能够尽可能地减少不必要的数据shuffle。

3.1选择存储方案

【建议】表的存储类型是表定义设计的第一步,客户业务类型是决定表的存储类型的主要因素,表存储类型的选择依据请参考[表1

表 1 表的存储类型及场景

存储类型适用场景
行存- 点查询(返回记录少,基于索引的简单查询)。

3.2 选择分布方案

【建议】表的分布方式的选择一般遵循以下原则:

表 2 表的分布方式及使用场景

分布方式描述适用场景
Hash表数据通过Hash方式散列到数据库实例中的所有DN上。数据量较大的事实表。
Replication数据库实例中每一个DN都有一份全量表数据。维度表、数据量较小的事实表。
Range表数据对指定列按照范围进行映射,分布到对应DN。用户需要自定义分布规则的场景。
List表数据对指定列按照具体值进行映射,分布到对应DN。用户需要自定义分布规则的场景。

3.3 选择分区方案

当表中的数据量很大时,应当对表进行分区,一般需要遵循以下原则:

  • 【建议】使用具有明显区间性的字段进行分区,比如日期、区域等字段上建立分区。
  • 【建议】分区名称应当体现分区的数据特征。例如,关键字+区间特征。
  • 【建议】将分区上边界的分区值定义为MAXVALUE,以防止可能出现的数据溢出。

典型的分区表定义如下:

CREATE TABLE staffS_p1
(
  staff_ID       NUMBER(6) not null,
  FIRST_NAME     VARCHAR2(20),
  LAST_NAME      VARCHAR2(25),
  EMAIL          VARCHAR2(25),
  PHONE_NUMBER   VARCHAR2(20),
  HIRE_DATE      DATE,
  employment_ID  VARCHAR2(10),
  SALARY         NUMBER(8,2),
  COMMISSION_PCT NUMBER(4,2),
  MANAGER_ID     NUMBER(6),
  section_ID     NUMBER(4)
)
PARTITION BY RANGE (HIRE_DATE)
( 
   PARTITION HIRE_19950501 VALUES LESS THAN ('1995-05-01 00:00:00'),
   PARTITION HIRE_19950502 VALUES LESS THAN ('1995-05-02 00:00:00'),
   PARTITION HIRE_maxvalue VALUES LESS THAN (MAXVALUE)
);

3.4 选择分布键

Hash表的分布键选取至关重要,如果分布键选择不当,可能会导致数据倾斜,从而导致查询时,I/O负载集中在部分DN上,影响整体查询性能。因此,在确定Hash表的分布策略之后,需要对表数据进行倾斜性检查,以确保数据的均匀分布。分布键的选择一般需要遵循以下原则:

  • 【建议】选作分布键的字段取值应该比较离散,以便数据能在各个DN上均匀分布。当单个字段无法满足离散条件时,可以考虑使用多个字段一起作为分布键。一般情况下,可以考虑选择表的主键作为分布键。例如,在人员信息表中选择证件号码作为分布键。
  • 【建议】在满足第一条原则的情况下,尽量不要选取在查询中存在常量过滤条件的字段作为分布键。例如,在表dwcjk相关的查询中,字段zqdh存在常量过滤条件“zqdh=‘000001’”,那么就应当尽量不选择zqdh字段做为分布键。
  • 【建议】在满足前两条原则的情况,尽量选择查询中的关联条件为分布键。当关联条件作为分布键时,join任务的相关数据都分布在DN本地,将极大减少DN之间的数据流动代价

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

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

相关文章

SSTI---总结

Laravel Blade是Laravel提供的一个既简单又强大的模板引擎 和其他流行的PHP模板引擎不一样,Blade并不限制你在视图view中使用原生的PHP代码 所有的Blade视图页面都将被编译成原生的PHP代码并缓存起来,除非你的的模板文件修改,否则不会重新编…

【RabbitMQ教程】第一章 —— RabbitMQ - 安装

💧 【 R a b b i t M Q 教程】第一章—— R a b b i t M Q − 安装 \color{#FF1493}{【RabbitMQ教程】第一章 —— RabbitMQ - 安装} 【RabbitMQ教程】第一章——RabbitMQ−安装💧 🌷 仰望天空,妳我亦是行人.✨ &#x…

腾讯丁珂:以数字安全免疫力建设安全新范式

6月13日,腾讯安全联合IDC等多家机构在北京举办研讨论坛,并发布“数字安全免疫力”模型框架,提出用免疫的思维应对新时期下安全建设与企业发展难以协同的挑战。腾讯集团副总裁、腾讯安全总裁丁珂在论坛上表示,数智化新阶段&#xf…

springCloud 中,openFeign 使用说明

文章目录 1、openFeign 中的每个方法中的参数和注解不能少。2、开启日志打印功能3、超时 1、openFeign 中的每个方法中的参数和注解不能少。 如果服务端方法中的数据含有注解,则 客户端 openFeign 中的每个方法中的参数和注解一个不能少,比较完全一致。…

chatgpt赋能python:Python抠图教程:用代码实现高效抠图

Python 抠图教程:用代码实现高效抠图 什么是抠图? 在设计、美术、广告等领域中,经常需要把一张图片中的某个物体或人物单独提取出来,以便于进行后续的处理、叠加、合成等操作。这个过程就叫做抠图。 传统的抠图方式需要用到PS、…

【MCS-51】外接数码管

单片机可以连的显示外设有很多种,我们常用到的就是连接LED显示,但是除了LED以外,我们还有很多外部的显示元件,包括数码管、点阵屏等由圆管或者方管LED组成的显示屏,接下来我们着重来看如何使用51单片机外接数码管进行显…

chatgpt赋能python:Python如何打开Word文档?

Python 如何打开 Word 文档? Python 是一种强大的编程语言,可以帮助我们完成各种重复性工作,其中包括自动化文件的处理。在这篇文章中,我们将学习如何使用 Python 打开 Word 文档。本文将介绍三种不同的方式:使用 Pyt…

05-修建数据殿堂:Golang struct的艺术架构

📃个人主页:个人主页 🔥系列专栏:Golang基础 💬Go(又称Golang)是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性,拥有高效的并发编程能力和简洁的语法。G…

【送书福利-第十一期】清华社 IT BOOK 图书活动:前端、后端、C++、Python、人工智能 ~(共送5本)!

大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我! 本文目录 一、前言二、内容介绍1、《C高性…

chatgpt赋能python:Python怎么批量加注释

Python怎么批量加注释 作为一名有10年python编程经验的工程师,我觉得注释是程序开发过程中最为重要的一部分。注释能够提高代码的可读性,让其他开发者更容易理解和阅读代码,并且也方便后续维护和修改。但很多时候,我们可能需要在…

“怎样提高学习效率——介绍一款适合大学生的多功能平台【WRITE-BUG数字空间】“

作为一名大学生,我深刻体会到在学习和写作过程中所面临的诸多挑战和困难。在这个过程中,我发现了一个非常好用和实用的平台——【WRITE-BUG数字空间】。在我的使用经历中,Writebug帮助我一站式地管理和创作一些内容,包括学习作业、…

详解c++---set的介绍

目录标题 set容器的介绍set的构造函数insert函数的介绍find函数erase函数count函数lower_boundupper_boundmultiset set容器的介绍 set容器可以看成我们上一篇文章学习的K结构的搜索二叉树,所以set容器不仅可以存储数据,还可以对数据进行排序和去重&…

DAY22:二叉树(十二)二叉搜索树最小绝对差+二叉搜索树中的众数

文章目录 530.二叉搜索树的最小绝对差思路完整版双指针优化写法:不用创建数组遍历pre root为什么是指向当前遍历的前一个节点 501.二叉搜索树中的众数(这道题要知道普通二叉树怎么写)思路完整版普通二叉树的写法sort自定义比较函数cmp的情况…

[论文阅读笔记77]LoRA:Low-Rank Adaptation of Large Language Models

1. 基本信息 题目论文作者与单位来源年份LoRA: Low-Rank Adaptation of Large Language ModelsmicrosoftInternational Conference on Learning Representations2021 524 Citations 论文链接:https://arxiv.org/pdf/2106.09685.pdf 论文代码:https://…

IMX6ULL裸机篇之SPI实验

一. SPI 实验 SPI实验:学习如何使用 I.MX6U 的 SPI 接口来驱动 ICM-20608,读取 ICM-20608 的六轴数据。 本文学习 SPI主控芯片的代码编写。其中,包括SPI工作模式设置,主从模式设置,时钟配置等实现。 二. SPI 主控芯…

EBU5476 Microprocessor System Design 知识点总结_2 Arm architecture

ARM架构 ARM是一个指令集,前面讲的几个汇编指令这些都算做指令。 ARM公司有意思的地方是,他们不做ARM设备,他们只设计指令集架构,然后授权(知识产权核,IP核)给其他半导体厂商做。 A&#xff…

大数据分析与机器学习:技术深度与实例解析【上进小菜猪大数据系列】

上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货。 大数据分析与机器学习已成为当今商业决策和科学研究中的关键组成部分。本文将深入探讨大数据技术的背景和原则,并结合实例介绍一些常见的大数据分析和机器学习技术。 …

chatgpt赋能python:Python如何拟合直线:使用最小二乘法

Python如何拟合直线:使用最小二乘法 在数据分析和机器学习领域,拟合一个最佳的直线是很常见和有用的。Python中有很多库可以拟合直线,但最小二乘法是其中最常用的一种方法。在本文中,我们将介绍最小二乘法的原理和如何在Python中…

【Goalng 开源项目】还在手写重复的 CRUD 吗?这个开源项目帮你解放双手

gormpher Gormpher 介绍快速开始WebObject 接口约定查询单条数据删除单条数据创建单条数据编辑单条数据条件查询多条数据 进阶WebObject 配置项动态接口函数Gorm 泛型函数Admin 源码handleEditObjecthandleQueryObject Gormpher 介绍 gormpher 是一个轻量级的 Golang 库 基于…

编译原理及应用期末复习

杂 3型文法 右线性文法 短语、直接短语、句柄 、判断是否是二义性文法 1、证明是二义性文法:证明存在一个句子有两颗不同的语法树 ① 画语法分析树 ② 、NFA、DFA K:所有状态,包含初始状态 Σ:终结字符集 M:状…