• GaussDB数据库SQL系列-子查询
    GaussDB数据库SQL系列-子查询一、前言在数据库技术领域,SQL(结构化查询语言)是一种用于管理关系数据库的标准语言。它允许用户从数据库中检索、插入、更新和删除数据,以及执行各种高级的数据操作。在本文中,我们将重点介绍GaussDB SQL中的子查询功能。子查询是SQL中的一种重要技术,它允许我们在一个查询中嵌套另一个查询,从而实现更复杂的数据查询和分析。二、GaussDB SQL子查询表达式1、EXISTS/NOT EXISTSEXISTS/NOT EXISTS是SQL中的语法,SQL 会首先执行子查询,然后根据子查询的结果是否满足条件来决定是否继续执行主查询。如果子查询返回至少一行数据,则 EXISTS 条件与主查询结合使用并被视为满足。NOT EXISTS 则相反,它只会在子查询没有返回任何数据行时才会被视为满足。EXISTS的参数是一个任意的SELECT语句,或者说子查询。系统对子查询进行运算以判断它是否返回行。如果它至少返回一行,则EXISTS结果就为"真";如果子查询没有返回任何行, EXISTS的结果是"假"。这个子查询通常只是运行到能判断它是否可以生成至少一行为止,而不是等到全部结束。语法:WHERE column_name EXISTS/NOT EXISTS (subquery)2、IN/NOT ININ 和 NOT IN 是 SQL 中的子查询运算符,用于测试某个给定的比较值是否存在于某一组值里。如果外层查询里的行与子查询返回的某一个行相匹配,那么 IN 的结果为真。如果外层查询里的行与子查询返回的所有行都不匹配,那么 NOT IN 的结果为真。语法:WHERE column_name IN/NOT IN (subquery)3、ANY/SOMEANY 和 SOME 都是用于子查询中的关键字。 ANY 表示子查询中的任何值都可以与外部查询中的值匹配。 SOME 与 ANY 相同,只是在语法上的差别。右边的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较(=、<>、<、<=、>、>=),其结果必须是布尔值。如果至少获得一个真值,则ANY结果为“真”。如果全部获得假值,则结果是“假”(包括子查询没有返回任何行的情况)。语法:WHERE column_name operator ANY/SOME (subquery)4、ALL右边的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较(=、<>、<、<=、>、>=),其结果必须是布尔值。如果全部获得真值,ALL结果为"真"(包括子查询没有返回任何行的情况)。如果至少获得一个假值,则结果是"假"。语法:WHERE column_name operator ALL (subquery)条件描述column_name > ALL(…)column_name列中的值必须大于要评估为true的集合中的最大值。column_name >= ALL(…)column_name列中的值必须大于或等于要评估为true的集合中的最大值。column_name < ALL(…)column_name列中的值必须小于要评估为true的集合中的最小值。column_name <= ALL(…)column_name列中的值必须小于或等于要评估为true的集合中的最小值。column_name <> ALL(…)column_name列中的值不得等于要评估为true的集合中的任何值。column_name = ALL(…)column_name列中的值必须等于要评估为true的集合中的任何值。三、GaussDB SQL子查询实验示例在接下来的内容中,我们将以GaussDB数据库为实验平台,通过示例来演示如何利用这些子查询。1、创建实验表--课程表:course(cid,cname,teid)--cid 课程编号,cname 课程名称,tid 教师编号--创建course表CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));--初始化INSERT INTO course VALUES('01' , '语文' , '02');INSERT INTO course VALUES('02' , '数学' , '01');INSERT INTO course VALUES('03' , '英语' , '03');--查看结果SELECT * FROM course;--教师表teacher(teid,tname)--tid 教师编号,tname 教师姓名--创建teacher表CREATE TABLE teacher(teid VARCHAR(10),tname VARCHAR(10));--初始化数据INSERT INTO teacher VALUES('01' , '张老师');INSERT INTO teacher VALUES('02' , '李老师');INSERT INTO teacher VALUES('03' , '王老师');INSERT INTO teacher VALUES('04' , '赵老师');--查看SELECT * FROM teacher;2、EXISTS/NOT EXISTS示例--查询在course表中的教师记录SELECT * FROM teacher WHERE EXISTS (SELECT * FROM course WHERE course.teid = teacher.teid);--查询没有在course表中的教师记录SELECT * FROM teacher WHERE NOT EXISTS (SELECT * FROM course WHERE course.teid = teacher.teid);3、IN/NOT IN 示例--根据教师id匹配course表SELECT * FROM course WHERE teid IN (SELECT teid FROM teacher );--取不在course表的教师信息SELECT * FROM teacher WHERE teid NOT IN (SELECT teid FROM course );4、ANY/SOME 示例--左侧主句与右侧子查询进行字段比对,获取需要的结果集SELECT * FROM course WHERE teid < ANY (SELECT teid FROM teacher where teid<>'04');--或SELECT * FROM course WHERE teid < some (SELECT teid FROM teacher where teid<>'04');Tip:此示例主要展示ANY/SOME的查询效果,实际应用请结合具体场景使用。5、ALL示例--teid列中的值必须小于要评估为true的集合中的最小值。SELECT * FROM course WHERE teid < ALL(SELECT teid FROM teacher WHERE teid<>'01');--teidc列中的值必须大于要评估为true的集合中的最大值。SELECT * FROM teacher WHERE teid > ALL(SELECT teid FROM course);Tip:此示例主要展示ALL的查询效果,实际应用请结合具体场景使用。四、注意事项及建议禁止一条SQL语句中,出现重复子查询语句。少用标量子查询(标量子查询指结果为1个值,并且条件表达式为等值的子查询)。避免在SELECT目标列中使用子查询,可能导致计划无法下推影响执行性能。子查询嵌套深度建议不超过2层。由于子查询会带来临时表开销,过于复杂的查询应考虑从业务逻辑上进行优化。五、小结子查询可以在 SELECT 语句中嵌套其他查询,从而实现更复杂的查询。子查询还可以在 WHERE 子句中使用其他查询的结果,从而更好地过滤数据。但是子查询可能会导致查询性能问题和代码难阅读和理解。 所以在GaussDB等数据库中使用SQL子查询时,请结合实际业务情况进行操作。——结束
  • [技术干货] GaussDB数据库SQL系列-UNION & UNION ALL
    一、前言SQL(结构化查询语言)是一种用于管理关系型数据库的标准语言。它允许用户通过使用SQL语言来操作数据库中的数据。而在SQL中,UNION是一个非常强大的功能,它可以将多个SELECT语句的结果合并成一个结果集。本文将以GaussDB数据库为例,介绍一下UNION 操作符的使用。二、GaussDB UNION/UNION ALL1、GaussDB UNION 操作符GaussDB UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。2、语法定义1)UNION语法SELECT column1,column2,……FROM table1[WHERE condition]UNIONSELECT column1,column2,……FROM table2[WHERE condition]2)UNION ALL 语法SELECT column1,column2,……FROM table1[WHERE condition]UNION ALLSELECT column1,column2,……FROM table2[WHERE condition]说明:UNION在合并两个或多个集合时会执行去重操作,而UNION ALL则直接将两个或者多个结果集合并,不执行去重。 另外,执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻辑已确认了两个集合不存在重重复数据时,可直接用UNION ALL 替代UNION,以便提升性能。三、GaussDB实验示例并初始化本文以GaussDB数据库为实验平台,1、创建实验表1)学生信息表student(ID、姓名、性别、城市)--创建学生信息表CREATE table student(sId VARCHAR(10) NOT NULL,sname VARCHAR(10) NOT NULL,ssex VARCHAR(10) NOT NULl,scity VARCHAR(10) NOT NULl);--初识化实验数据INSERT INTO student VALUES('s01' , '赵雷' , '男', 'XIAN');INSERT INTO student VALUES('s02' , '钱电' , '男', 'YUNNAN');INSERT INTO student VALUES('s03' , '孙风' , '男', 'NIXIA');INSERT INTO student VALUES('s04' , '李云' , '男', 'XIZANG');INSERT INTO student VALUES('s05' , '周梅' , '女', 'XINJIANG');INSERT INTO student VALUES('s06' , '吴兰' , '女', 'CHENGDU');INSERT INTO student VALUES('s07' , '郑竹' , '女', 'XIAN');INSERT INTO student VALUES('s08' , '张三' , '女', 'CHENGDU');--查看结果集SELECT * FROM student;2)教师信息表teacher(ID、姓名、性别、城市)--创建教师信息表CREATE table teacher(teid VARCHAR(10) NOT NULL,tname VARCHAR(10) NOT NULL,tsex VARCHAR(10) NOT NULL,tcity VARCHAR(10) NOT NULL);--初始化实验数据INSERT INTO teacher VALUES('t01' , '张磊', '男', 'XIAN');INSERT INTO teacher VALUES('t02' , '李强', '男', 'BEIJING');INSERT INTO teacher VALUES('t03' , '王刚', '男', 'XINJIANG');--查看结果集SELECT * FROM teacher;2、合并且除重(UNION)--获取学生和教师所属的城市,并按城市名称首字母升序排序。SELECT t.cityFROM (SELECT scity AS cityFROM studentUNIONSELECT tcity AS cityFROM teacher) tORDER BY t.city ASC;结果集如下截图,且城市数据不存在重复:3、合并不除重(UNION ALL)--获取所有学生和教师所属的城市,并按城市名称首字母升序排序。SELECT t.cityFROM (SELECT scity AS cityFROM studentUNION ALLSELECT tcity AS cityFROM teacher) tORDER BY t.city ASC;结果集如下截图,罗列了所有城市数据:4、合并带有WHERE子句SQL结果集(UNION ALL)--获取来自'XIAN'的学生和教师的所有信息,并按学生和教师的编号升序排序。SELECT t.*FROM(SELECT Sid AS id,Sname AS name,Ssex AS sex,Scity AS cityFROM student WHERE Scity='XIAN'UNION ALLSELECT Tid AS id,Tname AS name,Tsex AS sex,Tcity AS cityFROM teacher WHERE Tcity='XIAN') tORDER BY t.id ASC;结果集如下截图,罗列了'XIAN'的学生和教师的所有信息:5、业务逻辑除重后合并(UNION ALL)在一些业务场景下,比如上游系统提供的两张表或者多张表之间互相不会存重复数据,且自身也不存在重复数据,则为了提升合并时SQL性能、减少SQL执行时间,则选择UNION ALL操作符。四、GaussDB UNION常见错误1、“each UNION query must have the same number of columns”解决思路:根据提示查看两个表的表结构,看字段数量是否一支。2、“UNION types timestamp without time zone and text cannot be matched”解决思路:根据提示查看两个表的表结构,看字段类型是否一致。五、小结在实际业务场景中,无论选择GaussDB数据库,还是其他关系型数据库,在使用UNION和UNION ALL 时,都需要注意以下几点:左右两侧的SQL字段数量和字段类型需要保持一致;业务需求是否需要考虑数据除重(合并前除重还是合并时除重);根据表中数据量的大小,需要对SQL的执行效率进行评估,从而考虑是否需要选择临时表进行过渡后再合并;需要考虑SQL编写的复杂度,不能为了写SQL而写SQL,需要结合业务需求进行选择。——结束
  • GaussDB数据库SQL系列-表连接(JOIN)
    一、前言SQL是用于数据分析和数据处理的最重要的编程语言之一,表连接(JOIN)是数据库中SQL的一种常见操作,在实际应用中,我们需要根据业务需求从两个或多个相关的表中获取信息。二、GaussDB JOINGaussDB是华为推出的企业级分布式关系型数据库。GaussDB JOIN 子句是基于两个或者多个表之间的共同字段把它们进行结合。在GaussDB数据库中,常用的JOIN有如下几种连接及用法:INNER JOIN、LEFT JOIN、RIGHT JOIN、 FULL JOIN、CROSS JOIN。1、LEFT JOINLEFT JOIN 一般称左连接,也写作 LEFT OUTER JOIN。左连接查询会返回左表中所有记录,且在右表中找到的关联数据列也会被一起返回。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1LEFT JOIN table2 t2ON t1.id=t2.id ;2、LEFT JOIN EXCLUDING INNER JOIN返回左表有但右表没有关联数据的记录集。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1LEFT JOIN table2 t2ON t1.id=t2.idWHERE t2.id IS NULL ;3、RIGHT JOINRIGHT JOIN 一般称右连接,也写作 RIGHT OUTER JOIN。右连接查询会返回右表中所有记录,且在左表中找到的关联数据列也会被一起返回。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1RIGHT JOIN table2 t2ON t1.id=t2.id4、LEFT JOIN EXCLUDING INNER JOIN返回右表有但左表没有关联数据的记录集。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1RIGHT JOIN table2 t2ON t1.id=t2.idWHERE t1.id IS NULL ;5、INNER JOININNER JOIN 一般被译作内连接。获取左表和右表中能关联起来的数据。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1INNER JOIN table2 t2ON t1.id=t2.id ;6、FULL OUTER JOINFULL OUTER JOIN 一般称外连接、全连接,实际查询语句中可以写作FULL JOIN。外连接查询能返回左右表里的所有记录。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1FULL OUTER JOIN table2 t2ON t1.id=t2.id ;7、FULL OUTER JOIN EXCLUDING INNER JOIN返回左表和右表里没有相互关联的记录集。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1FULL OUTER JOIN table2 t2ON t1.id=t2.idWHERE t1.id IS NULLOR t2.id IS NULL ;除以上几种外,另有 CROSS JOIN(迪卡尔集),但此用法不常用,可做拓展研究。三、GaussDB 实验示例创建两张实验表:Students(学生表)和Score(学生成绩表)。1、初始化实验表1)Students(学生表):--学生表,Students(SNO, SNAME)代表 (学号,姓名)DROP TABLE students;CREATE TABLE students(sno INTEGER NOT NULL,sname varchar(32));--插入数据INSERT INTO students(sno,sname) VALUES (1001,'张三');INSERT INTO students(sno,sname) VALUES (1002,'李四');INSERT INTO students(sno,sname) VALUES (1003,'王五');INSERT INTO students(sno,sname) VALUES (1004,'赵六');INSERT INTO students(sno,sname) VALUES (1005,'韩梅');INSERT INTO students(sno,sname) VALUES (1006,'李雷');--查看表信息SELECT * FROM students;2)Score(学生成绩表):--学生成绩表,Score(SNO, SCGRADE) 代表(学号,成绩)DROP TABLE score;CREATE TABLE score(sno INTEGER NOT NULL,scgrade DECIMAL(3,1));--插入数据INSERT INTO score(sno,scgrade)values(1001,98);INSERT INTO score(sno,scgrade)values(1002,95);INSERT INTO score(sno,scgrade)values(1003,97);INSERT INTO score(sno,scgrade)values(1004,99);--查看表信息SELECT * FROM score;2、LEFT JOIN(示例)--表students为主表SELECT t1.sno,t1.sname,t2.sno,t2.scgradeFROM students t1LEFT JOIN score t2ON t1.sno=t2.sno3、RIGTH JOIN(示例)--表score 为主表SELECT t1.sno,t1.sname,t2.sno,t2.scgradeFROM students t1RIGHT JOIN score t2ON t1.sno=t2.sno4、INNER JOIN(示例)--根据字段sno获取两个表中都有的数据SELECT t1.sno,t1.sname,t2.sno,t2.scgradeFROM students t1INNER JOIN score t2ON t1.sno=t2.sno5、FULL JOIN(示例)--获取左右表里的所有记录。SELECT t1.sno,t1.sname,t2.sno,t2.scgradeFROM students t1FULL JOIN score t2ON t1.sno=t2.sno四、小结数据库表连接(Join)是将两个或多个表中的数据根据一定的条件进行组合,在实际应用中,数据库表连接可以帮助我们快速地获取所需的数据信息,提高数据处理效率。需要注意的是,不同的数据库系统对表连接的支持程度可能存在差异,需要根据具体的数据库类型选择合适的连接方式。(本文是以GaussDB云数据库为实验平台)——结束
  • [技术干货] GaussDB数据库的元数据及其管理简介
    一、前言GaussDB是一种分布式的关系型数据库,元数据(表、列、视图、索引、存储过程等对象)是其重要的一部分。元数据是指描述数据的数据,包括数据的定义、结构、属性、关系等信息。本文以GaussDB物理数据库为主,结合元数据的概念简单介绍一下相关内容。二、元数据简介1、元数据定义按照传统的定义,元数据(Metadata)是描述数据的数据。元数据主要记录数据库应用系统中模型的定义、各层级间的映射关系、监控数据库应用系统的数据状态及ETL的任务运行状态等。在数据库应用系统中,元数据可以帮助数据库管理员和开发人员非常方便地找到其所关心的数据,并用于指导其进行数据管理和开发工作,提高工作效率。2、元数据分类元数据可根据不同的维度进行分类,按用途的不同,可以分为两类:技术元数据(Technical Metadata)和业务元数据(Business Metadata)。技术元数据是存储关于数据库应用系统技术细节的数据,是用于开发和管理数据库应用系统使用的数据。技术元数据即为技术资产,显示数据库、数据表、数据量的数量及其详情。业务元数据从业务角度描述了数据库应用系统中的数据,它提供了介于使用者和实际系统之间的语义层,使得不懂计算机技术的业务人员也能够“读懂”数据库应用系统中的数据。业务元数据包含业务资产和指标资产,业务资产显示业务对象、逻辑实体、业务属性的数量及其详情,指标资产显示业务指标及其详情。3、数据库元数据管理元数据管理是对数据采集、存储、加工和展现等数据全生命周期的描述信息,帮助用户理解数据关系和相关属性。 数据库的元数据指的是关于数据库对象(如表、列、索引、视图、存储过程等)的信息,这些信息描述了这些对象的结构和属性。并且最终目标是服务于数据库应用系统的高效实施(开发、管理、维护等)。三、GaussDB数据库的元数据管理1、GaussDB数据库的元数据管理通过登录GaussDB提供的“数据管理服务(DAS)” 工具,进入“库管理(Schema列表/对象列表/元数据采集)”主页面,可进行相关元数据的基础管理(如下图)。GaussDB数据库对象列表:GaussDB数据库元数据采集(DAS工具内置功能):Tip:对象列表数据来自实时查询(最多显示10000条),对数据库有一定的性能消耗,建议开启元数据自动采集2、通过“SQL + 系统表/系统视图/系统函数”的方式管理(采集)元数据1)获取表、视图及表字段等信息(1)PG_GET_TABLEDEF(tablename)系统信息函数,获取表定义信息。SELECT * FROM PG_GET_TABLEDEF(‘test_1’)返回类型:text。说明:pg_get_tabledef重构出表定义的CREATE语句,包含了表定义本身、索引信息、comments信息。对于表对象依赖的group、schema、tablespace、server等信息。(2)ADM_TABLES视图存储关于数据库下的所有表信息。主要字段:表的所有者、表名、存储表的表空间名、表的估计行数、是否为临时表等SELECT * FROM ADM_TABLES;(3)DB_ALL_TABLES视图存储当前用户所能访问的表或视图。主要字段:表或视图的所有者、表或视图的名称、表或视图所在的表空间。SELECT * FROM DB_ALL_TABLES;(4)DB_TABLES视图存储当前用户可访问的所有表。主要字段:表的所有者、表名、存储表的表空间名、表的估计行数、是否为临时表等。SELECT * FROM DB_TABLES;(5)ADM_TAB_COLUMNS视图存储关于表和视图的字段信息。数据库里每个表或视图的每个字段都在ADM_TAB_COLUMNS里有一行。主要字段:表的所有者、表的名称、列名、列的数据类型、列的字节长度等。SELECT * FROM ADM_TAB_COLUMNS;(6)DB_TAB_COLUMNS视图存储了当前用户可访问的表和视图的列的描述信息。主要字段:表的所有者、表的名称、列名、列的数据类型、列的字节长度等。SELECT * FROM DB_TAB_COLUMNS;2)获取定时任务信息MY_JOBS系统视图获取其定义信息。主要字段:作业创建者、作业执行者、作业对应的数据库名称、开始执行时间、结束时间、运行状态等。--获取定时任务信息SELECT * FROM MY_JOBS;3)获取索引信息PG_INDEXES系统视图获取表中的索引信息-- 根据表名获取对应的索引信息SELECT schemaname,tablename,indexname,tablespace,indexdefFROM PG_INDEXESWHERE TABLENAME = 'sell_info_full'AND INDEXNAME IS NOT NULL;4)获取存储过程、函数、触发器等信息DB_SOURCE视图存储当前用户可访问的存储过程、函数、触发器的定义信息。该视图同时存在于PG_CATALOG和SYS schema下。 主要字段:对象的所有者、对象名字、对象类型(function, procedure, trigger)、存储对象的文本来源等。SELECT * FROM DB_SOURCE;GaussDB数据库元数据的获取/采集主要是以系统表、视图、函数等方式获取,其元数据不止包含TABLES、VIEWS、COLUMNS、SOURCE、JOB,还包括USERS、COMMENTS等。 具体可根据实际业务需要进行采集管理。四、小结元数据管理从技术角度,元数据管理着企业的数据源系统、数据平台、数据仓库、数据模型、数据库、表、字段以及字段间的数据关系等技术元数据。从业务角度,元数据管理着企业的业务术语表、业务规则、质量规则、安全策略以及表的加工策略、表的生命周期信息等业务元数据。从应用系统角度,元数据管理为数据提供了完整的加工处理全链路跟踪,方便数据的溯源和审计,这对于数据的合规使用越来越重要。通过数据血缘分析,追溯发生数据质量问题和其他错误的根本原因,并对更改后的元数据进行影响分析等。GaussDB数据库的元数据管理是数据库系统管理工作的核心之一。它可以帮助用户更好地管理和维护数据库,提高数据的安全性和可靠性,减少数据丢失和损坏的风险。同时,元数据管理还可以帮助用户更好地理解和使用数据库,提高工作效率 。——结束
  • [技术干货] GaussDB的行存表与列存表的选择
    一、前言行存表和列存表是数据库中两种常见的数据存储方式。随着信息技术的飞速发展,数据存储和管理以及如何高效地存储和处理大量的数据已经成为了我们的一大挑战。为了解决这个问题,行存表与列存表应运而生,它们以其独特的优势在各个场景得到了高效的应用。GaussDB支持行、列存储,本文将简单给大家介绍一下行列存储在GassuDB数据库中的应用。二、行列存储表的概念1、定义行存表(Row-Based Table)是一种以行为单位进行数据的存储方式,每个记录都有一个唯一的行标识符。列存表(Column-Based Table)是以列为单位进行数据的存储方式,每个记录都有一个唯一的列标识符。2、优势与劣势行存表的优势在于其结构简单,易于理解和操作。由于数据按照行进行存储,因此在查询某一行数据时,可以快速定位到目标位置。此外,行存表在进行数据的插入、删除和更新操作时,效率相对较高。然而,行存表的缺点也比较明显,那就是它不适合进行复杂的数据分析和处理,因为这种存储方式无法充分利用数据的关联性,导致查询性能较差。列存表的优势在于其强大的查询功能和高效的存储效率。由于数据按照列进行存储,因此可以很容易地对某一列的数据进行聚合、分组等操作。此外,列存表还可以通过索引等技术提高查询性能。然而,列存表的缺点在于其结构复杂,不易于理解和操作。尤其是在进行数据的插入、删除和更新操作时,需要考虑到数据的完整性和一致性问题,因此操作起来相对繁琐。三、行列存储表的逻辑介绍GaussDB支持行、列存储,默认情况下,创建的表为行存储。行存储和列存储的差异如下图示。1、行存表与行存表在硬盘上的存储方式在基于行存储的数据库中,数据是按照行数据为基础逻辑存储单元进行存储的,一行中的数据在存储介质中以连续存储形式存在。2、列存表与列存表在硬盘上的存储方式在基于列式存储的数据库中,数据是按照列数据为基础逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。因此,行存表和列存表在硬盘上的存储方式也不同。对于行存表,每个记录都占用一个连续的空间块,而对于列存表,每个属性都有一个单独的空间块,所有属性值都存储在一个连续的空间块中。四、行列存储表的使用建议和场景一般情况下,如果表的字段比较多(大宽表),查询中涉及到的列不多的情况下,适合列存储。如果表的字段个数比较少,查询大部分字段,那么选择行存储比较好。1、行存表使用场景及GaussDB SQL示例创建行存表,默认是创建的是行存表:--创建行存表,默认是创建的是行存表CREATE TABLE test_1(EMPLOYEE__ID CHAR(4),EMPLOYEE_NAME VARCHAR2(10),EMPLOYEE_SEX CHAR(2),EMPLOYEE_AGE INT,EMPLOYEE_SALARY MONEY);--查看已创建的表结构SELECT * FROM PG_GET_TABLEDEF(‘test_1’)2、列存表使用场景及GaussDB SQL示例创建列存表,使用关键字:WITH (ORIENTATION = COLUMN)--创建列存表,使用关键字:WITH (ORIENTATION = COLUMN)CREATE TABLE test_2(EMPLOYEE__ID CHAR(4),EMPLOYEE_NAME VARCHAR2(10),EMPLOYEE_SEX CHAR(2),EMPLOYEE_AGE INT,EMPLOYEE_SALARY MONEY)WITH (ORIENTATION = COLUMN);--查看已创建的表结构SELECT * FROM PG_GET_TABLEDEF(‘test_2’)五、小结行存表和列存表各有优缺点,适用于不同的场景。GaussDB支持行列存储。行、列存储模型各有优劣,在实际应用中,我们需要根据具体的需求选择合适的存储方式,以实现高效的数据管理和分析。无论是行存表还是列存表,都是我们在探索数据世界道路上的重要工具,值得我们深入研究和掌握。——结束
  • [技术干货] GaussDB云数据库配套工具UGO
    一、前言在数字化时代,企业面临着越来越多的数据库和应用迁移需求。为了满足这一需求,华为云推出了一款全新的数据库和应用迁移解决方案(数据库和应用迁移UGO)。该方案主要用于解决企业数据迁移难的问题(比如语法不兼容、技术不支持、改造成本高......尤其对于异构数据库来说,迁不了、移不动、高成本)。 它可以帮助用户轻松实现源数据库到目标平台的迁移,降低迁移成本,提高转化率。二、数据库和应用迁移UGO定义1、UGO定义数据库和应用迁移 UGO(Database and Application Migration UGO,以下简称为UGO)是专注于异构数据库结构迁移的专业服务。通过UGO,可将源数据库中的DDL、DML和DCL一键自动转换为华为云GaussDB/RDS的SQL语法,通过数据库评估、对象迁移两大核心功能和自动化语法转换,提前识别可能存在的改造工作、提高转化率、最大化降低用户数据库迁移成本。2、异构数据库迁移简图说明:主要分三块,源数据库、迁移工具(服务)和目标数据库。源数据库主要可以包含线下数据库(如oracle、mysql……)和云上数据库(如RDS、自研的……);数据库迁移工具主要包含UGO(语法迁移)、DRS(数据迁移与校验);目标数据库主要是华为云数据库(如GaussDB、RDS等)。三、数据库迁移的痛点数据库迁移存在的一些痛点问题:复杂性高:传统数据库迁移通常需要对源数据库进行大量的修改和调整,包括数据结构、存储方式、索引等。这些修改可能会导致应用程序的不兼容或者性能下降等问题,从而增加迁移的复杂性和风险。成本高昂:传统数据库迁移通常需要专业的团队进行规划、设计和实施,需要投入大量的人力、物力和时间。同时,如果迁移过程中出现问题,还需要进行额外的修复和调整,增加了成本和风险。风险高:传统数据库迁移涉及到多个系统和应用程序之间的交互和依赖关系,一旦出现问题可能会影响整个系统的稳定性和可用性。此外,由于源数据库和目标数据库之间存在差异,迁移过程中可能会出现数据丢失、损坏等问题,从而导致业务中断和损失。可扩展性差:传统数据库迁移通常是一次性的事件,一旦完成就无法再进行扩展和升级。如果需要添加新的功能或者支持更多的用户,就需要重新进行数据库迁移,这会增加成本和风险。数据库迁移存在一系列的痛点问题,这些问题不仅会影响企业的运营效率和竞争力,还会增加企业的成本和风险。因此,采用新型的数据库迁移工具和技术是解决企业数据库迁移的关键。四、数据库和应用迁移UGO能力介绍UGO 是专注于异构数据库对象迁移和应用迁移的专业化工具。通过预迁移评估、结构迁移二大核心功能,助力用户轻松实现一键上云、一键切换数据库。源数据库画像:以海量源库的业务场景为样本、以数据库关键指标为特性进行算法训练,以得出该源库实例的画像信息。选型与规格:以源库画像作为输入,经过UGO目标推荐模型,为用户推荐合适的目标库和规格组合。目标库的选型方案会根据源库画像输入动态生成不同推荐组合。兼容性分析:以源库画像为输入,通过UGO内核对目标库的转化率,对14个核心对象类型进行兼容性分析。工作量评估:以源库画像为输入,线下海量场景的人力迁移成本为评估基线,经过UGO的评估模型,可以分析该数据库实例的迁移成本,包括DBA、开发、测试的工作量。结构迁移:以预迁移评估为输入和方案指导,支持用户在转换前自定义过滤迁移对象,转换完成后,标记转换失败对象和失败原因,用户可以根据失败原因进行对象校正,校正之后进行验证测试,验证失败对象回到校正步骤进行重新修改,持续提交验证。直至所有对象验证成功。SQL迁移:分两部分,第一部分在应用侧部署Agent进行流量捕获,采集从应用侧提交到数据库的SQL语句,并通过UGO内核进行动态转换,转换后的SQL在目标侧进行回放,并生成性能分析报告。第二部分对应用侧提交到源库的SQL进行采集,采集之后通过UGO内核进行转换,在目标库验证转换准确性,生成SQL翻译报告,供开发人员进行应用程序改造。五、数据库和应用迁移UGO方案简图介绍随着GaussDB云化发展,通过UGO,可以轻松便捷的进行数据库和应用迁移。UGO的迁移过程主要分五步:第一步:源数据库,支持线下数据库或其他云数据库作为源端。第二步:对象采集,对数据库进行数据采集,采集信息除了对象结构和SQL之外,还包含容量、性能、复杂度、配置等信息。第三步:迁移评估,分析源库进行画像,对目标库的兼容性、选型、规格、工作量、风险等进行评估,提前预知风险。第四步:转换校验,对采集的对象进行等价语法转换,并对转换后的语法进行校验测试。第五步:迁移上线(目标库),对验证通过的对象自动应用到目标库。最佳实践可参考官网《Oracle结构迁移到GaussDB》:cid:link_0六、小结数据库对象迁移过程的本质是将UGO转换后的数据库对象的SQL语句在目标库执行。数据库迁移阶段完成后,分别抽取源库和目标库的对象属性进行比对,以确保使用UGO进行数据库对象迁移后是否存在对象丢失的情况。UGO负责对源库进行风险和工作量评估,自动转换异构数据库语法,据了解,目前已经做到了95%的自动化;DRS负责全量和增量数据的实时在线迁移和同步,通过数据一致性比对确保数据零丢失。 华为云数据库提供“GaussDB + UGO + DRS”一站式迁移上云解决方案,可帮助用户提前识别迁移风险,提升迁移效率,最大化降低用户的数据库迁移成本 。——结束。
  • [技术干货] GaussDB OLTP 云数据库配套工具DAS
    一 、前言传统的数据库管理软件,不仅需要下载安装、功能还比较单一,而且已经滞后于云服务的发展模式。华为GaussDB云数据库提供了配套的生态工具数据管理服务DAS。 DAS通过与数据库内核的紧密结合,提供了数据库开发、运维、智能诊断一站式云上数据库管理平台,方便用户使用和运维华为云数据库。二、DAS的定义1、DAS的定义数据管理服务(Data Admin Service,简称DAS),是一种提供数据库可视化操作的工具,包括基础SQL操作、高级数据库管理、智能化运维等功能,旨在帮助用户易用、安全、智能的进行数据库管理(连上网络、打开浏览器,即可随时随地、方便快捷的使用DAS),大幅提高工作效率,让数据管理变得既简单又安全。2、DAS功能特点轻松管理:实现云上可视化界面连接和管理数据库易操作:简单方便访问数据,且支持类似Excel方式编辑数据,SQL零基础也能无障碍进行表数据编辑及统计分析操作;支持保存常用的SQL,并提供SQL模板,可随时引用执行,简单易用。高效率:实现云端研发测试,快速部署,快速访问数据库,提升研发效率。安全防护:云端专用通道管理数据,华为云严格控制数据库访问。操作安全保障:内置了安全保护措施,有效保障数据库的稳定运行,让用户操作起来更安心;比如:用户执行一个慢SQL时,DAS会自动设香超时机制,防止因慢SQL执行时间过久而导致的数据库性能抖动。可视化对象管理:导航树形结构,清晰展示各个对象并实现可视化结构管理功能。三、DAS应用场景1、标准版面向开发人员,最好用的数据库客户端,无需安装本地客户端,所见即所得的可视化提作体验,提供数据和表结构的同步、在线编辑,SQL输入的智能提示等丰富的数据库开发功能。元数据管理:库、表列表、表大小索引大小、存储过程、函数。SQL优化:SQL语句优化改写;索引优化建议;执行计划展示。SQL查询窗口:智能化的SQL输入提示;查询结果在线编辑;历史查询记录快速复用;同步(导入导出):10G大小的SQL附件导入;整库、指定表、查询SQL等多种方式的数据导出;可跨实例的库之间的表结构一致性比对与同步数据操作:快速、自动化的填充表的测试数据;基于binlog解析,对误删数据进行找回对象结构操作:可见可得的表结构在线编辑2、企业版数据是企业的核心资产,如何控制敏感数据访问权限、实现数据库变更安全、操作可回溯审计、降低DBA人力成本,是数据库实例数量达到一定规模时企业的重要诉求。企业 DevOPS平台,基于权限最小化控制和审批流程机制提供数据保护、变更审核、提作审计研发自助化等数据库DevOPS平台,帮助企业实现大规模数据库下的标准化规范化、高效率、超安全的管理手段。数据访问安全:员工不接触数据库登录名和密码,对库的查询需要先申权限,支持每天查询的总次数、总数据行数、每次查询的最大返回行数等多维度查询控制。敏感数据保护:敏感字段自动识别并进行打标;员工在执行查询和导出时,敏感数据脱敏显示。变更安全:所有对库的操作,均有审计日志记录,数据库操作行为可追溯。操作审计:变更SQL的风险识别;业务审核控制;变更执行时的数据库水位自动检测;大数据表的数据清理。提效率降成本:灵活的安全风险和审批流程自定义;库上的业务Owner和DBA角色的赋权,将低风险的库变更操作流程下放到业务主管,降低企业的DBA人力成本。四、操作示例(标准版)本小节主要以开发者的使用身份简单介绍一下DAS的基本操作和使用。1、登录华为控制台登录,输入账号密码2、新增数据库实例链接步骤一:选择“数据库 > 数据管理服务 DAS”如下图显示两个模块,一个是开发工具(面向开发者)、一个是DBA智能运维(面向DBA&运维人员)。选择“进入开发工具”步骤二:点击“新增数据库实例登录”步骤三:选择数据库引擎、数据库来源(实例)、实例对应的用户名及密码(记住密码),点击确认。步骤四:点击“登录”步骤五:成功登录DAS管理界面3、新建对象在DAS管理界面,我们可以创建和管理数据库对象等。步骤一:点击“新建数据库”,填写数据库名称并确认。步骤二:通过“库管理”,进行对象(表、视图、存储过程、触发器、序列)创建或者“SQL操作”界面,进行对象(表、视图、存储过程、触发器、序列)创建。4、SQL操作打开“SQL操作”界面,会有SQL输入提示,协助完成SQL编写。步骤一:点击“SQL操作”按钮,打开SQL操作界面;步骤二:在SQL界面编辑区,我们可以进行SQL编辑操作,例如查询等步骤三:编写SQL,DAS提供SQL提示功能;步骤四:按键盘F8,或者点击编辑区的“执行SQL(F8)”运行,即可获得执行结果。5、导入导出在导入导出界面,我们可以将已有的SQL语句导入数据库中执行,将数据库文件或者SQL结果集进行导出保存。1)导入步骤一:新建导入任务,可以导入SQL文件或者CSV文件;步骤二:选择文件来源,既可以是本地导入,也可以从OBS获取;步骤三:选择数据库,导入后的文件将在在对应的库内执行。2)导出:方式一:导出数据库方式二:导出SQL结果集五、小结DAS工具的功能非常强大和全面,其通过DAS的核心能力和差异化能力,为用户提供了全面的数据库管理和运维解决方案,使得用户可以更加方便地使用和管理华为云GaussDB数据库,同时也提高了数据库的可靠性和效率。——结束。
  • [技术干货] GaussDB OLTP云数据库配套工具DRS
    一、前言华为GaussDB云数据库提供了配套的生态工具数据复制服务DRS。 DRS围绕云数据库,降低数据库之间数据流通的复杂性,有效帮助企业减少数据传输处理的成本。本文将主要介绍一下DRS是什么以及它的使用场景和核心功能。二、DRS定义与使用场景1、DRS定义华为云数据复制服务(DRS ,Data Replication Service)是一种易用、稳定、高效,用于数据库在线迁移和数据库实时同步的云服务。你可通过数据复制服务快速解决多场景下数据库之间的数据流通问题,满足数据传输业务需求。2、DRS场景示意图系统迁移以及业务数据迁移是数据库常见活动之一。VPC网络:基于虚拟私有云(VPC,Virtual Private Cloud)网络的数据迁移,是指实时迁移场景下,源数据库与目标数据库属于同一个虚拟网络内或者跨可通信虚拟网络内,不需要额外搭建其他网络服务。VPN网络:基于虚拟专用网络(VPN,Virtual Private Network)的数据迁移,是指实时迁移场景下,源数据库与目标数据库属于同一个可通信的虚拟网络内,并且通过VPN在用户的其他数据中心和云平台之间建立的一条符合行业标准的安全加密通信通道,可将已有数据中心无缝扩展到云上。业务不中断,公网数据库数据迁移:其他云数据库和用户本地数据库迁移至华为云:RDS(云数据库)、DDS(文档数据库服务)、DDM(分布式数据库中间件)、GaussDB、GaussDB(for MySOL)、GaussDB(DWS)、CSS(云搜索服务)、GaussDB(for Mongo)。业务不中断,VPN/专线数据迁移:本地数据中心数据库迁移至华为云:RDS(云数据库)、DDS(文档数据库服务)、DDM(分布式数据库中间件)、GaussDB、GaussDB(for MySOL)、GaussDB(DWS)、CSS(云搜索服务)、GaussDB(for Mongo)。业务不中断,VPC网络内数据库数据迁移:华为云内,VPC网络自建数据库迁移至华为云:RDS(云数据库)、DDS(文档数据库服务)、DDM(分布式数据库中间件)、GaussDB、GaussDB(for MySOL)、GaussDB(DWS)、CSS(云搜索服务)、GaussDB(for Mongo)。三、DRS核心功能DRS的核心功能:1、实时迁移管理实时迁移,只需配置迁移的源、目标数据库实例及迁移对象即可自动完成整个数据迁移过程。实时迁移可通过增量迁移,将业务系统中断时间和影响最小化,实现数据库平滑迁移上云。特点:支持通过多种网络链路,实现跨云平台数据库迁移、云下数据库迁移上云或云上跨Region的数据库迁移等多种业务场景。2、实时同步管理实时同步,是指在不同的系统之间实现关键业务数据的实时流动,不同于迁移,迁移数据库以整体搬迁为目的,同步则是维持不同业务系统之间数据的持续流动,常见的场景是: 实时分析、报表系统、数仓环境等。特点:聚焦在表和数据,并满足多种同步灵活性的需要,如多对一,一对多,不同表名之间同步数据等。3、备份迁移管理备份迁移,通过将源数据库的数据导出成备份文件,上传至对象存储服务OBS,然后恢复到目标数据库。特点:在不暴露IP地址也不碰触源数据库的情况下,即可实现数据迁移,安全、可靠。4、数据订阅管理数据订阅,获取数据库中关键业务的数据变化信息,然后通过数据订阅将这类信息缓存并提供统一的SDK接口,方便下游业务订阅、获取、并消费。特点:实现数据库与下游系统解耦,与业务流程解耦等。5、实时灾备管理实时灾备,通过异地近实时的数据同步可以实现跨区,跨云,本地和云、混合云之间数据库形成灾备关系,提供一键主备倒换、数据比对、时延监控、数据补齐等容灾特性支持容灾演练、真实容灾等场景,支持主从灾备、主主灾备多种灾备架构。特点:异地远距离传输优化,围绕灾备提供特性,不同于业界基于简单的数据同步形成方案。无需预先投入巨额基础设施。四、小结DRS可以解决企业业务不中断的数据迁移问题,同时DRS工具还提供预检查、迁移监控、数据一致性对比等配套能力。 通过这些能力,华为云GaussDB已经在各大行项目中广泛应用,同时华为云数据库迁移解决方案是信通院数据库迁移评测中首个获得最高级迁移能力的厂商,华为云GaussDB数据库致力于通过技术,给客户提供一套安全放心的迁移解决方案。——结束
  • [技术干货] GaussDB OLTP云数据库配套工具DDM
    一、前言现在越来越多的企业应用在逐步向云平台迁移,同时这对云平台带了一个严峻的考验和挑战。但针对华为云GaussDB数据库, 我们在生态方面做了比较健全的建设,同时自研了很多相应的原生态工具。本文我们主要介绍一下GaussDB 云数据库的配套工具DDM。二、DDM定义DDM(Distributed Database Middleware),是由华为云自主研发的云原生分布式数据库中间件,以服务的方式为应用提供对多个数据库实例进行分布式透明访问。彻底解决数据库可扩展性问题,实现海量数据的存储和高并发访问。三、DDM业务架构DDM业务架构(来源华为云官网):DDM业务架构:将底层的数据库引擎进行一个分布式的集中管理。应用服务访问DDM实例即可,无需关心底层分片式的数据库,所有的业务逻辑等都有DDM路由分发,从而让应用透明访问。作为管理员,可以通过DDM的控制台进行图形化管理,比如实例管理、平滑扩容、逻辑库管理等。作为开发人员,可以将开发的应用程序通过DDM控制台进行部署等。作为最终用户,只需要访问业务(应用)服务即可。四、为什么需要DDM?以某个应用系统为例(从无到有,从有少量数据到大量数据甚至到海量数据):1、初始阶段,所有数据存放在一个数据库(服务器)中。2、小规模(<500QPS或100TPS,读用户<100,写用户<10): 在单库中通过读写分离提升并发读的性能。3、中规格(<5000QPS或1000TPS,读用户<5000,写用户<100): 垂直分库,将不同的业务分布到不同的数据库。4、大规模以上(10000+QPS,10000+TPS 读用户10000+,写用户1000+): 数据分片,将数据表分到不同的数据库中。但是当业务扩展越来多、数据量越来越大时,这样的分片管理也会越来越复杂,因为你的数据库越来越多(分片)。中间件分片方案:优势: 应用0改动,与语言无关;对应用完全透明地进行数据库扩展;通过连接共享有效收敛连接数。劣势: 可能存在额外的时延。五、DDM特性DDM采用存算分离架构,提供分库分表、读写分离、弹性扩容等能力,具有稳定可靠、高度可扩展、持续可运维的特点。服务器集群管理对用户完全透明,用户通过DDM管理控制台进行数据库运维与数据读写,提供类似传统单机数据库的使用体验。1、DDM实现读写分离即插即用:自动实现读写分离,支持配置不同节点的性能权重应用透明:应用感觉仍是操作单节点,DB调整应用无感知高可用:主从切换或从节点故障对应用透明2、DDM实现数据分片,应用0改动大表分片:支持按Hash等算法实现自动分片自动路由:根据分片规则,将SQL路由至真正的数据源连接复用:通过MySQL实例的连接池复用,大幅提升数据库并发访问能力3、DDM实现数据库水平扩展,自动均衡数据无限扩展:支持分片个数无上限,轻松应对海量数据全自动化:一键式扩容,异常自动回滚业务影响小:秒级中断,其他时间业务无感知。六、DDM应用场景DDM主要适用于大规模的数据存储与高并发访问的行业应用,例如:1、互联网应用电商、金融、O2O、零售、社交应用等行业,普遍存在用户基数大、营销活动频繁、核心交易系统数据库响应日益变慢的问题,制约业务发展。DDM提供线性水平扩展能力,能够实时提升数据库处理能力,提高访问效率,轻松应对高并发的实时交易场景。2、物联网数据在工业监控和远程控制、智慧城市的延展、智能家居、车联网等物联网场景下,传感监控设备多,采样频率高,数据规模大,会产生超过单机数据库存储能力极限的数据,造成数据库容量瓶颈。DDM提供的容量水平扩展能力,可以有效的帮助用户低成本的存储海量数据。3、高性价比数据库解决方案政务机构、大型企业、银行等行业为了支持大规模数据存储和高并发数据库访问,传统方案需要强依赖小型机和高端存储等高成本的商业解决方案。DDM利用普通服务器进行集群部署,提供与传统商业解决方案相同甚至更高的处理能力。——结束
  • [技术干货] 数据库模型设计案例分享(GaussDB版)
    一、前言GaussDB数据库是一款企业级分布式数据库,支持集中式和分布式两种部署形态。它面向金融互联网交易和政企OA/办公等场景,具有安全可靠、超高性能、简单易用等优势。在GaussDB中,数据建模是非常重要的一部分。数据建模是指根据业务需求和数据特点,将现实世界中的实体、属性、关系等概念抽象出来,并用一定的方式表示成计算机可以理解的形式。数据库模型设计的目的是为了建立一个能够满足业务需求的数据存储结构,使得数据的存储、查询、更新等操作更加高效、可靠、安全。在GaussDB中,可以使用E-R图来进行数据建模,E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型,它可以帮助您更好地理解您的业务逻辑并将其转换为关系模型。二、应用系统数据库设计的基本流程应用系统数据库设计基本流程简图:第一步:需求分析:主要包括数据、功能、性能等第二步:数据库设计:主要包括概念结构设计、逻辑结构设计、物理结构设计等第三步:数据库实施:选择数据库软件,并进行落地。第四步:数据库系统运行、维护和优化。其中数据库设计(Database Design)是E-R设计模型中的主要环节。三、数据库模型设计本节结合GaussDB数据库的相关知识点,以简单的订单模型举例来演示数据库模型的设计过程。数据库模型设计主要分以下3个阶段:1、概念结构设计阶段概念数据模型(CDM)是按用户的观点来对数据和信息建模,其目标是统一业务概念,作为业务人员和技术人员之间沟通的桥梁,确定不同实体之间的最高层次的关系。其特征包括:面向用户,反映用户的业务需求抽象性强,不涉及具体实现细节层次结构清晰,各层之间有一定的关系可扩展性好,可以方便地添加新的实体和关系等。所以这个阶段,我们主要完成从需求中抽象出示实体集和关系集。示例系统:订单系统,实体(订单、客户、供应商、商品、地址)。实体集之间关系集梳理:1)客户与订单是一对多2)客户与地址是一对一3)供应商与地址是一对一4)供应商与商品是一对多5)订单与商品是一对多如图, 确定不同实体之间的最高层次的关系:2、逻辑结构设计阶段逻辑数据模型(LDM)尽可能详细地描述数据, 逻辑数据模型的特征包括:包括所有实体和它们之间的关系指定了每个实体的所有属性指定外键(标识不同实体之间关系的键)关系表规范化等。如图, 完善每个实体的属性:3、物理结构设计阶段物理数据模型(PDM)表示如何在数据库中构建模型。 物理数据库模型显示所有表结构,包括列名,列数据类型,列约束,主键,外键以及表之间的关系。物理数据模型的功能包括:规范所有表和列外键用于标识表之间的关系。物理上的考虑可能导致物理数据模型与逻辑数据模型有差异不同的RDBMS的物理数据模型将有所不同,例如MySQL和GaussDB之间列的数据类型可能有所不同。目标是指定如何用数据库模式来实现逻辑数据模型,以及真正的保存数据。如图,完成所有实体转换为表,转换所有关系集为相关表的外键,转换所有属性为列。针对上面的物理数据模型设计时,GaussDB数据库有如下字段设置规范建议:合理选用字符串数据类型。优先使用变长字符类VARCHAR。只有该字段输入确定为固定字符则使用定长字符类型,或需要自动补充空格,才使用CHAR(n)。字符类型字段不应存储数字类型的数据。如果对存储在字符类型字段中的数据进行数值计算,或者与数值进行比较操作(如置于过滤条件中),会带来不必要的数据类型转换的开销,同时该字段上的索引可能失效,影响查询性能。字符类型字段不应存储时间或日期类数据。如果对存储在字符类型字段中的数据与日期类数据进行计算或比较操作(如置于过滤条件中),会带来不必要的数据类型转换的开销,同时该字段上的索引可能失效,影响查询性能。对于明确不存在NULL值的字段加上NOT NULL约束。对于NOT NULL字段,优化器在某些场景下会进行特殊优化,可较大提升查询性能。相关联字段的数据类型应保持一致。在进行关联操作时,如果字段类型不一致,会带来数据类型转换开销。大字段(例如varchar(1000)、varchar(4000))不建议超过8个。字段定义时建议同时创建COMMENT注释信息,以便于未来维护。不建议对表预留字段。大部分场景下可支持快速新增、删除表字段,或者修改字段的DEFAULT值。尽量使用高效的数值类数据类型。在满足业务精度的情况下,选择的优先级从高到低依次为整数、浮点数、NUMERIC。合理设置数值字段的数据类型,根据取值范围选择合适的数值类型,尽量少用NUMERIC/DECIMAL类型。NUMERIC和DECIMAL等价,NUMERIC(或DECIMAL)数据类型操作对CPU消耗较高。数据库模型设计的三个主要阶段汇总如下:概念数据模型设计阶段:实体、关系集逻辑数据模型设计阶段:实体、关系集、属性、主键、外键物理数据模型设计阶段:表、列名、列数据类型、主键、外键四、小结通常,数据建模是为了让查询更简单、更高效。在现实场景中,如果要想高效的使用好数据库,那么一个优秀的数据建模是必不可少的。数据模型是应用系统数据库设计的基础,而数据库则是数据模型实现的工具。本文建模后是在GaussDB数据库平台上进行落地实验的,其逻辑与思路与大多少关系型数据库基本通用。——结束
  • [技术解读] GaussDB云数据库SQL应用系列—分区表管理
    前言本文将介绍GaussDB云数据库的分区表技术,包括原理、优势以及如何使用。通过本文,您将了解到如何利用GaussDB云数据库的分区表功能提高数据存储和查询性能。一、分区表基本原理分区表是一种数据组织方式,将一张大表按照某个字段的值进行划分,形成多个小表。每个小表独立管理,具有独立的索引和存储空间。这种方式可以提高查询性能和降低存储成本。在GaussDB云数据库中,分区表可以根据用户需求自动或手动创建。目前行存表支持范围分区、哈希分区、列表分区,列存表仅支持范围分区。二、分区表主要优势查询性能提升 :分区表将数据分散到多个小表中,使得查询时只需扫描对应小表的数据,减少了扫描的范围,从而提高了查询速度。数据维护便捷 :对于大型表,数据维护变得非常困难。而分区表可以将数据分散到多个小表中,使得数据维护更加便捷。例如,对某个分区进行删除操作时,只需要删除该分区对应的小表即可。扩展性好 :随着业务的发展,数据量会不断增加。分区表可以根据业务需求动态调整分区数量,以满足更高的查询性能和存储需求。三、分区表常见场景大数据处理:在处理大量数据时,分区表可以显著提高查询性能和存储效率。通过将数据按照某个字段进行分区,可以减少扫描的数据量,从而提高查询速度。高并发访问:分区表可以有效地降低单个表的锁竞争,提高并发访问能力。当多个用户同时访问一个分区表时,每个用户只能访问到自己需要的部分数据,降低了锁冲突的可能性。关于GaussDB,若要把普通表转成分区表,需要新建分区表,然后把普通表中的数据导入到新建的分区表中。因此在初始设计表时,请根据业务提前规划是否使用分区表。四、GaussDB分区表管理(示例)示例一:创建范围分区表(RANGE)范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期,例如将销售数据按照月份进行分区。1、创建一个按年份分区的订单表:--创建范围分区表(RANGE)DROP TABLE orders_1;CREATE TABLE orders_1 (id INT PRIMARY KEY,order_date CHAR(4) ,customer_id INT,product_name VARCHAR(255)) PARTITION BY RANGE (order_date)( PARTITION p1 VALUES LESS THAN (2021),PARTITION p2 VALUES LESS THAN (2022),PARTITION p3 VALUES LESS THAN (2023),PARTITION P4 VALUES LESS THAN(MAXVALUE));--查看创建的分区表信息select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_1');2、写入测试数据并访问--插入测试数据INSERT INTO orders_1(id,order_date,customer_id,product_name)VALUES(1001,'2021',100,'商品A');INSERT INTO orders_1(id,order_date,customer_id,product_name)VALUES(1002,'2022',200,'商品B');INSERT INTO orders_1(id,order_date,customer_id,product_name)VALUES(1003,'2023',300,'商品C');--访问分区表:-- 只查询2020年的数据SELECT * FROM orders_1 WHERE order_date = 2021;-- 查询2020年至2022年的数据SELECT * FROM orders_1 WHERE order_date BETWEEN 2021 AND 2022;-- 只查询2020年之后的数据(超出范围的数据将被过滤掉)SELECT * FROM orders_1 WHERE order_date >= 2021;3、删除/增加/修改--DROPALTER TABLE orders_1 DROP PARTITION P5;--ADDALTER TABLE orders_1 ADD PARTITION P4 VALUES LESS THAN (2024);ALTER TABLE orders_1 ADD PARTITION P6 VALUES LESS THAN (2025);ALTER TABLE orders_1 ADD PARTITION P10 VALUES LESS THAN (MAXVALUE);--RENAMEALTER TABLE orders_1 RENAME PARTITION P10 TO P5;--查看创建的分区表信息select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_1') ;示例二:创建哈希分区表(HASH)哈希分区表:将数据根据内部哈希算法依次映射到每一个分区中,包含的分区个数由创建分区表时指定。1、假设我们有一个名为orders_2的大表,包含id(订单ID)、customer_id(客户ID)、order_date(订单日期)等字段。现在我们需要根据customer_id进行分区,以便更好地管理和查询这些数据。--创建哈希分区表(HASH)drop TABLE orders_2;CREATE TABLE orders_2 (id INT PRIMARY KEY,customer_id INT,order_date DATE) PARTITION BY HASH (customer_id)( partition p1,partition p2 );--查看创建的分区表信息select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_2');2、写入测试数据并访问--插入测试数据INSERT INTO orders_2(id,customer_id,order_date)VALUES(1001,100,date '20230613');INSERT INTO orders_2(id,customer_id,order_date)VALUES(1002,200,date '20230614');INSERT INTO orders_2(id,customer_id,order_date)VALUES(1003,300,date '20230615');INSERT INTO orders_2(id,customer_id,order_date)VALUES(1004,400,date '20230612');----访问分区表:--查询customer_id 为100的订单表信息SELECT * FROM orders_2 WHERE customer_id =100;--查询customer_id 为100、200的订单表信息SELECT * FROM orders_2 WHERE customer_id IN (100,200);--查询customer_id 不是100、200的订单表信息SELECT * FROM orders_2 WHERE customer_id NOT IN (100,200);3、删除--删除分区表 drop tableDROP TABLE orders_2 ;--删除分区数据 truncate分区alter table orders_2 truncate partition p2;示例三:创建列表分区(LIST)列表分区表:将数据中包含的键值分别存储在不同的分区中,依次将数据映射到每一个分区,分区中包含的键值由创建分区表时指定。1、以订单表为例,创建一个list分区表--创建列表分区(LIST)DROP TABLE orders_3;CREATE TABLE orders_3 (id INT PRIMARY KEY,customer_id INT,order_date DATE,product_id INT,quantity INT) PARTITION BY LIST (customer_id) (PARTITION p1 VALUES (100),PARTITION p2 VALUES (200),PARTITION p3 VALUES (300),PARTITION p4 VALUES (400),PARTITION p5 VALUES (500));--查看创建的分区表信息select relname,parttype,parentid,boundaries from pg_partition where parentid in (SELECT parentid FROM pg_partition where relname='orders_3');2、写入测试数据并访问--插入测试数据INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1001,100,date '20230613',1,10);INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1002,100,date '20230613',2,20);INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1003,100,date '20230613',3,30);INSERT INTO orders_3(id,customer_id,order_date,product_id,quantity)VALUES(1004,100,date '20230613',4,40);--访问分区表--根据分区字段查询select * from orders_3 where customer_id = 100--根据分区P1查询select * from orders_3 partition (p1);3、ADD/TRUNCATE/DROP--ADD,增加分区ALTER TABLE orders_3 add partition p6 values (600);--TRUNCATE,删除分区数据ALTER TABLE orders_3 truncate partition p6;--DROP,删除分区表ALTER TABLE orders_3 drop partition p6;五、总结GaussDB云数据库是一款高性能、高可用的云原生关系型数据库,支持多种数据存储和计算引擎。其中,分区表是GaussDB云数据库的一项重要特性,在GaussDB云数据库中使用分区表,可以帮助用户提高查询性能、降低存储成本、方便数据维护等方面的问题。——结束。
  • [技术解读] GaussDB OLTP 云数据库配套工具DAS
    一 、前言传统的数据库管理软件,不仅需要下载安装、功能还比较单一,而且已经滞后于云服务的发展模式。华为GaussDB云数据库提供了配套的生态工具数据管理服务DAS。 DAS通过与数据库内核的紧密结合,提供了数据库开发、运维、智能诊断一站式云上数据库管理平台,方便用户使用和运维华为云数据库。二、DAS的定义1、DAS的定义数据管理服务(Data Admin Service,简称DAS),是一种提供数据库可视化操作的工具,包括基础SQL操作、高级数据库管理、智能化运维等功能,旨在帮助用户易用、安全、智能的进行数据库管理(连上网络、打开浏览器,即可随时随地、方便快捷的使用DAS),大幅提高工作效率,让数据管理变得既简单又安全。2、DAS功能特点轻松管理:实现云上可视化界面连接和管理数据库易操作:简单方便访问数据,且支持类似Excel方式编辑数据,SQL零基础也能无障碍进行表数据编辑及统计分析操作;支持保存常用的SQL,并提供SQL模板,可随时引用执行,简单易用。高效率:实现云端研发测试,快速部署,快速访问数据库,提升研发效率。安全防护:云端专用通道管理数据,华为云严格控制数据库访问。操作安全保障:内置了安全保护措施,有效保障数据库的稳定运行,让用户操作起来更安心;比如:用户执行一个慢SQL时,DAS会自动设香超时机制,防止因慢SQL执行时间过久而导致的数据库性能抖动。可视化对象管理:导航树形结构,清晰展示各个对象并实现可视化结构管理功能。三、DAS应用场景1、标准版面向开发人员,最好用的数据库客户端,无需安装本地客户端,所见即所得的可视化提作体验,提供数据和表结构的同步、在线编辑,SQL输入的智能提示等丰富的数据库开发功能。元数据管理:库、表列表、表大小索引大小、存储过程、函数。SQL优化:SQL语句优化改写;索引优化建议;执行计划展示。SQL查询窗口:智能化的SQL输入提示;查询结果在线编辑;历史查询记录快速复用;同步(导入导出):10G大小的SQL附件导入;整库、指定表、查询SQL等多种方式的数据导出;可跨实例的库之间的表结构一致性比对与同步数据操作:快速、自动化的填充表的测试数据;基于binlog解析,对误删数据进行找回对象结构操作:可见可得的表结构在线编辑2、企业版数据是企业的核心资产,如何控制敏感数据访问权限、实现数据库变更安全、操作可回溯审计、降低DBA人力成本,是数据库实例数量达到一定规模时企业的重要诉求。企业 DevOPS平台,基于权限最小化控制和审批流程机制提供数据保护、变更审核、提作审计研发自助化等数据库DevOPS平台,帮助企业实现大规模数据库下的标准化规范化、高效率、超安全的管理手段。数据访问安全:员工不接触数据库登录名和密码,对库的查询需要先申权限,支持每天查询的总次数、总数据行数、每次查询的最大返回行数等多维度查询控制。敏感数据保护:敏感字段自动识别并进行打标;员工在执行查询和导出时,敏感数据脱敏显示。变更安全:所有对库的操作,均有审计日志记录,数据库操作行为可追溯。操作审计:变更SQL的风险识别;业务审核控制;变更执行时的数据库水位自动检测;大数据表的数据清理。提效率降成本:灵活的安全风险和审批流程自定义;库上的业务Owner和DBA角色的赋权,将低风险的库变更操作流程下放到业务主管,降低企业的DBA人力成本。四、操作示例(标准版)本小节主要以开发者的使用身份简单介绍一下DAS的基本操作和使用。1、登录华为控制台登录,输入账号密码2、新增数据库实例链接步骤一:选择“数据库 > 数据管理服务 DAS”如下图显示两个模块,一个是开发工具(面向开发者)、一个是DBA智能运维(面向DBA&运维人员)。选择“进入开发工具”步骤二:点击“新增数据库实例登录”步骤三:选择数据库引擎、数据库来源(实例)、实例对应的用户名及密码(记住密码),点击确认。步骤四:点击“登录”步骤五:成功登录DAS管理界面3、新建对象在DAS管理界面,我们可以创建和管理数据库对象等。步骤一:点击“新建数据库”,填写数据库名称并确认。步骤二:通过“库管理”,进行对象(表、视图、存储过程、触发器、序列)创建或者“SQL操作”界面,进行对象(表、视图、存储过程、触发器、序列)创建。4、SQL操作打开“SQL操作”界面,会有SQL输入提示,协助完成SQL编写。步骤一:点击“SQL操作”按钮,打开SQL操作界面;步骤二:在SQL界面编辑区,我们可以进行SQL编辑操作,例如查询等步骤三:编写SQL,DAS提供SQL提示功能;步骤四:按键盘F8,或者点击编辑区的“执行SQL(F8)”运行,即可获得执行结果。5、导入导出在导入导出界面,我们可以将已有的SQL语句导入数据库中执行,将数据库文件或者SQL结果集进行导出保存。1)导入步骤一:新建导入任务,可以导入SQL文件或者CSV文件;步骤二:选择文件来源,既可以是本地导入,也可以从OBS获取;步骤三:选择数据库,导入后的文件将在在对应的库内执行。2)导出:方式一:导出数据库方式二:导出SQL结果集五、小结DAS工具的功能非常强大和全面,其通过DAS的核心能力和差异化能力,为用户提供了全面的数据库管理和运维解决方案,使得用户可以更加方便地使用和管理华为云GaussDB数据库,同时也提高了数据库的可靠性和效率。——结束。
  • [技术解读] GaussDB OLTP云数据库配套工具DRS
    一、前言华为GaussDB云数据库提供了配套的生态工具数据复制服务DRS。 DRS围绕云数据库,降低数据库之间数据流通的复杂性,有效帮助企业减少数据传输处理的成本。本文将主要介绍一下DRS是什么以及它的使用场景和核心功能。二、DRS定义与使用场景1、DRS定义华为云数据复制服务(DRS ,Data Replication Service)是一种易用、稳定、高效,用于数据库在线迁移和数据库实时同步的云服务。你可通过数据复制服务快速解决多场景下数据库之间的数据流通问题,满足数据传输业务需求。2、DRS场景示意图系统迁移以及业务数据迁移是数据库常见活动之一。VPC网络:基于虚拟私有云(VPC,Virtual Private Cloud)网络的数据迁移,是指实时迁移场景下,源数据库与目标数据库属于同一个虚拟网络内或者跨可通信虚拟网络内,不需要额外搭建其他网络服务。VPN网络:基于虚拟专用网络(VPN,Virtual Private Network)的数据迁移,是指实时迁移场景下,源数据库与目标数据库属于同一个可通信的虚拟网络内,并且通过VPN在用户的其他数据中心和云平台之间建立的一条符合行业标准的安全加密通信通道,可将已有数据中心无缝扩展到云上。业务不中断,公网数据库数据迁移:其他云数据库和用户本地数据库迁移至华为云:RDS(云数据库)、DDS(文档数据库服务)、DDM(分布式数据库中间件)、GaussDB、GaussDB(for MySOL)、GaussDB(DWS)、CSS(云搜索服务)、GaussDB(for Mongo)。业务不中断,VPN/专线数据迁移:本地数据中心数据库迁移至华为云:RDS(云数据库)、DDS(文档数据库服务)、DDM(分布式数据库中间件)、GaussDB、GaussDB(for MySOL)、GaussDB(DWS)、CSS(云搜索服务)、GaussDB(for Mongo)。业务不中断,VPC网络内数据库数据迁移:华为云内,VPC网络自建数据库迁移至华为云:RDS(云数据库)、DDS(文档数据库服务)、DDM(分布式数据库中间件)、GaussDB、GaussDB(for MySOL)、GaussDB(DWS)、CSS(云搜索服务)、GaussDB(for Mongo)。三、DRS核心功能DRS的核心功能:1、实时迁移管理实时迁移,只需配置迁移的源、目标数据库实例及迁移对象即可自动完成整个数据迁移过程。实时迁移可通过增量迁移,将业务系统中断时间和影响最小化,实现数据库平滑迁移上云。特点:支持通过多种网络链路,实现跨云平台数据库迁移、云下数据库迁移上云或云上跨Region的数据库迁移等多种业务场景。2、实时同步管理实时同步,是指在不同的系统之间实现关键业务数据的实时流动,不同于迁移,迁移数据库以整体搬迁为目的,同步则是维持不同业务系统之间数据的持续流动,常见的场景是: 实时分析、报表系统、数仓环境等。特点:聚焦在表和数据,并满足多种同步灵活性的需要,如多对一,一对多,不同表名之间同步数据等。3、备份迁移管理备份迁移,通过将源数据库的数据导出成备份文件,上传至对象存储服务OBS,然后恢复到目标数据库。特点:在不暴露IP地址也不碰触源数据库的情况下,即可实现数据迁移,安全、可靠。4、数据订阅管理数据订阅,获取数据库中关键业务的数据变化信息,然后通过数据订阅将这类信息缓存并提供统一的SDK接口,方便下游业务订阅、获取、并消费。特点:实现数据库与下游系统解耦,与业务流程解耦等。5、实时灾备管理实时灾备,通过异地近实时的数据同步可以实现跨区,跨云,本地和云、混合云之间数据库形成灾备关系,提供一键主备倒换、数据比对、时延监控、数据补齐等容灾特性支持容灾演练、真实容灾等场景,支持主从灾备、主主灾备多种灾备架构。特点:异地远距离传输优化,围绕灾备提供特性,不同于业界基于简单的数据同步形成方案。无需预先投入巨额基础设施。四、小结DRS可以解决企业业务不中断的数据迁移问题,同时DRS工具还提供预检查、迁移监控、数据一致性对比等配套能力。 通过这些能力,华为云GaussDB已经在各大行项目中广泛应用,同时华为云数据库迁移解决方案是信通院数据库迁移评测中首个获得最高级迁移能力的厂商,华为云GaussDB数据库致力于通过技术,给客户提供一套安全放心的迁移解决方案。——结束
  • [技术解读] GaussDB OLTP云数据库配套工具DDM
    一、前言现在越来越多的企业应用在逐步向云平台迁移,同时这对云平台带了一个严峻的考验和挑战。但针对华为云GaussDB数据库, 我们在生态方面做了比较健全的建设,同时自研了很多相应的原生态工具。本文我们主要介绍一下GaussDB 云数据库的配套工具DDM。二、DDM定义DDM(Distributed Database Middleware),是由华为云自主研发的云原生分布式数据库中间件,以服务的方式为应用提供对多个数据库实例进行分布式透明访问。彻底解决数据库可扩展性问题,实现海量数据的存储和高并发访问。三、DDM业务架构DDM业务架构(来源华为云官网):DDM业务架构:将底层的数据库引擎进行一个分布式的集中管理。应用服务访问DDM实例即可,无需关心底层分片式的数据库,所有的业务逻辑等都有DDM路由分发,从而让应用透明访问。作为管理员,可以通过DDM的控制台进行图形化管理,比如实例管理、平滑扩容、逻辑库管理等。作为开发人员,可以将开发的应用程序通过DDM控制台进行部署等。作为最终用户,只需要访问业务(应用)服务即可。四、为什么需要DDM?以某个应用系统为例(从无到有,从有少量数据到大量数据甚至到海量数据):1、初始阶段,所有数据存放在一个数据库(服务器)中。2、小规模(<500QPS或100TPS,读用户<100,写用户<10): 在单库中通过读写分离提升并发读的性能。3、中规格(<5000QPS或1000TPS,读用户<5000,写用户<100): 垂直分库,将不同的业务分布到不同的数据库。4、大规模以上(10000+QPS,10000+TPS 读用户10000+,写用户1000+): 数据分片,将数据表分到不同的数据库中。但是当业务扩展越来多、数据量越来越大时,这样的分片管理也会越来越复杂,因为你的数据库越来越多(分片)。中间件分片方案:优势: 应用0改动,与语言无关;对应用完全透明地进行数据库扩展;通过连接共享有效收敛连接数。劣势: 可能存在额外的时延。五、DDM特性DDM采用存算分离架构,提供分库分表、读写分离、弹性扩容等能力,具有稳定可靠、高度可扩展、持续可运维的特点。服务器集群管理对用户完全透明,用户通过DDM管理控制台进行数据库运维与数据读写,提供类似传统单机数据库的使用体验。1、DDM实现读写分离即插即用:自动实现读写分离,支持配置不同节点的性能权重应用透明:应用感觉仍是操作单节点,DB调整应用无感知高可用:主从切换或从节点故障对应用透明2、DDM实现数据分片,应用0改动大表分片:支持按Hash等算法实现自动分片自动路由:根据分片规则,将SQL路由至真正的数据源连接复用:通过MySQL实例的连接池复用,大幅提升数据库并发访问能力3、DDM实现数据库水平扩展,自动均衡数据无限扩展:支持分片个数无上限,轻松应对海量数据全自动化:一键式扩容,异常自动回滚业务影响小:秒级中断,其他时间业务无感知。六、DDM应用场景DDM主要适用于大规模的数据存储与高并发访问的行业应用,例如:1、互联网应用电商、金融、O2O、零售、社交应用等行业,普遍存在用户基数大、营销活动频繁、核心交易系统数据库响应日益变慢的问题,制约业务发展。DDM提供线性水平扩展能力,能够实时提升数据库处理能力,提高访问效率,轻松应对高并发的实时交易场景。2、物联网数据在工业监控和远程控制、智慧城市的延展、智能家居、车联网等物联网场景下,传感监控设备多,采样频率高,数据规模大,会产生超过单机数据库存储能力极限的数据,造成数据库容量瓶颈。DDM提供的容量水平扩展能力,可以有效的帮助用户低成本的存储海量数据。3、高性价比数据库解决方案政务机构、大型企业、银行等行业为了支持大规模数据存储和高并发数据库访问,传统方案需要强依赖小型机和高端存储等高成本的商业解决方案。DDM利用普通服务器进行集群部署,提供与传统商业解决方案相同甚至更高的处理能力。——结束
  • [技术解读] 数据库模型设计案例分享(GaussDB版)
    一、前言GaussDB数据库是一款企业级分布式数据库,支持集中式和分布式两种部署形态。它面向金融互联网交易和政企OA/办公等场景,具有安全可靠、超高性能、简单易用等优势。在GaussDB中,数据建模是非常重要的一部分。数据建模是指根据业务需求和数据特点,将现实世界中的实体、属性、关系等概念抽象出来,并用一定的方式表示成计算机可以理解的形式。数据库模型设计的目的是为了建立一个能够满足业务需求的数据存储结构,使得数据的存储、查询、更新等操作更加高效、可靠、安全。在GaussDB中,可以使用E-R图来进行数据建模,E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型,它可以帮助您更好地理解您的业务逻辑并将其转换为关系模型。二、应用系统数据库设计的基本流程应用系统数据库设计基本流程简图:第一步:需求分析:主要包括数据、功能、性能等第二步:数据库设计:主要包括概念结构设计、逻辑结构设计、物理结构设计等第三步:数据库实施:选择数据库软件,并进行落地。第四步:数据库系统运行、维护和优化。其中数据库设计(Database Design)是E-R设计模型中的主要环节。三、数据库模型设计本节结合GaussDB数据库的相关知识点,以简单的订单模型举例来演示数据库模型的设计过程。数据库模型设计主要分以下3个阶段:1、概念结构设计阶段概念数据模型(CDM)是按用户的观点来对数据和信息建模,其目标是统一业务概念,作为业务人员和技术人员之间沟通的桥梁,确定不同实体之间的最高层次的关系。其特征包括:面向用户,反映用户的业务需求抽象性强,不涉及具体实现细节层次结构清晰,各层之间有一定的关系可扩展性好,可以方便地添加新的实体和关系等。所以这个阶段,我们主要完成从需求中抽象出示实体集和关系集。示例系统:订单系统,实体(订单、客户、供应商、商品、地址)。实体集之间关系集梳理:1)客户与订单是一对多2)客户与地址是一对一3)供应商与地址是一对一4)供应商与商品是一对多5)订单与商品是一对多如图, 确定不同实体之间的最高层次的关系:2、逻辑结构设计阶段逻辑数据模型(LDM)尽可能详细地描述数据, 逻辑数据模型的特征包括:包括所有实体和它们之间的关系指定了每个实体的所有属性指定外键(标识不同实体之间关系的键)关系表规范化等。如图, 完善每个实体的属性:3、物理结构设计阶段物理数据模型(PDM)表示如何在数据库中构建模型。 物理数据库模型显示所有表结构,包括列名,列数据类型,列约束,主键,外键以及表之间的关系。物理数据模型的功能包括:规范所有表和列外键用于标识表之间的关系。物理上的考虑可能导致物理数据模型与逻辑数据模型有差异不同的RDBMS的物理数据模型将有所不同,例如MySQL和GaussDB之间列的数据类型可能有所不同。目标是指定如何用数据库模式来实现逻辑数据模型,以及真正的保存数据。如图,完成所有实体转换为表,转换所有关系集为相关表的外键,转换所有属性为列。针对上面的物理数据模型设计时,GaussDB数据库有如下字段设置规范建议:合理选用字符串数据类型。优先使用变长字符类VARCHAR。只有该字段输入确定为固定字符则使用定长字符类型,或需要自动补充空格,才使用CHAR(n)。字符类型字段不应存储数字类型的数据。如果对存储在字符类型字段中的数据进行数值计算,或者与数值进行比较操作(如置于过滤条件中),会带来不必要的数据类型转换的开销,同时该字段上的索引可能失效,影响查询性能。字符类型字段不应存储时间或日期类数据。如果对存储在字符类型字段中的数据与日期类数据进行计算或比较操作(如置于过滤条件中),会带来不必要的数据类型转换的开销,同时该字段上的索引可能失效,影响查询性能。对于明确不存在NULL值的字段加上NOT NULL约束。对于NOT NULL字段,优化器在某些场景下会进行特殊优化,可较大提升查询性能。相关联字段的数据类型应保持一致。在进行关联操作时,如果字段类型不一致,会带来数据类型转换开销。大字段(例如varchar(1000)、varchar(4000))不建议超过8个。字段定义时建议同时创建COMMENT注释信息,以便于未来维护。不建议对表预留字段。大部分场景下可支持快速新增、删除表字段,或者修改字段的DEFAULT值。尽量使用高效的数值类数据类型。在满足业务精度的情况下,选择的优先级从高到低依次为整数、浮点数、NUMERIC。合理设置数值字段的数据类型,根据取值范围选择合适的数值类型,尽量少用NUMERIC/DECIMAL类型。NUMERIC和DECIMAL等价,NUMERIC(或DECIMAL)数据类型操作对CPU消耗较高。数据库模型设计的三个主要阶段汇总如下:概念数据模型设计阶段:实体、关系集逻辑数据模型设计阶段:实体、关系集、属性、主键、外键物理数据模型设计阶段:表、列名、列数据类型、主键、外键四、小结通常,数据建模是为了让查询更简单、更高效。在现实场景中,如果要想高效的使用好数据库,那么一个优秀的数据建模是必不可少的。数据模型是应用系统数据库设计的基础,而数据库则是数据模型实现的工具。本文建模后是在GaussDB数据库平台上进行落地实验的,其逻辑与思路与大多少关系型数据库基本通用。——结束
总条数:1672 到第 页
上滑加载中