1、openGauss 数据库开发指南Guidelines for openGauss database development目次前言引言1 范围12 规范性引用文件13 术语和定义14 数据库对象命名规范15 sql 开发规范36 应用使用规范147 行为使用规范15I引言为更好的契合openGauss的处理架构,输出更高效的业务sql代码,特制定本文件。本文件约定了数据库建模和数据库应用程序开发过程中,应当遵守的设计规范。IIIopenGauss 数据库开发指南1 范围本文件给出了openGauss数据库在开发设计阶段对于数据库建模和数据库应用程序开发过程的相关规范。本文件适用于兴业银行集团具有信息系统研发职能的相关单位。2 规范性引用文件下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。Q/CIB 40012023 生僻字处理指南3 术语和定义GB/T 158342011界定的以及下列术语和定义适用于本文件。3.1强制 compel【强制】带有此项注释的,指本条款应严格遵循,如
2、不遵循的在开发过程有可能导致各种潜在问题。注:按照GB/T 158342011中对于“方头括号(4.9.3.5)”的用法,【强制】用于标示被注释的条款效力。 来源:GB/T 158342011,4.9,有修改3.2建议 recommend【建议】带有此项注释的,指本条款宜遵循,以实现更好的性能,但不排除例外情况。注:按照GB/T 158342011中对于“方头括号(4.9.3.5)”的用法,【建议】用于标示被注释的条款效力。来源:GB/T 158342011,4.9,有修改4 数据库对象命名规范宜采用企业级数据字典中的数据项命名,按照数据字典数据项命名规范。注:命名由【限定词术语(0.n)】对象类术语(1) 表示术语(1)组成,最后一项是编号、代码、金额、标志等这样的类词。示例:比如 ctf_num、frtn_500_flg。164.1 【强制】禁止使用保留字和关键字禁止使用数据库保留字和关键字命名数据库对象,比如禁止使用 desc/group/where/like 等纯关键字命名表或列,禁止以pg_,gs_开头。可以使用select * from pg_get_keywords()在
3、数据库中查询 openGauss的关键字。create table testdb.test_t1(id int not null primary key, students_count int);示例 1:参考代码(正例)示例 2:参考代码(反例)create table testdb.test_t1(id int not null primary key, count int);4.2 【建议】数据库对象名称规范本规则适用于所有对象名,包括:库名、表名、列名、函数名、视图名、序列名、别名等。对象名长度不超过63个字符。数据库对象名称使用字母、数字、下划线的组合a-z_0-9,且必须以字母开头,字母宜统一用小写。不要使用驼峰命名,多个单词组合时,统一使用下划线(_)分割,禁止使用中横线(-)、禁止使用特殊符号、美元符号、禁止使用中文、禁止使用空格,禁止使用pg_开头命名对象,避免和系统表、视图混淆。user_name123示例 1:参考代码(正例)示例 2:参考代码(反例)user-namepg_username4.3 【建议】临时表和备份表命名规范临时表以tmp_开头、以日期结尾,备
4、份表以bak_开头、以日期结尾。create table testdb.tmp_test_t1_20221010(id int primary key, c int);示例:参考代码(正例)4.4 【建议】数据库命名规范openGauss数据库之间数据不交互,宜以应用名命名database,不建议直接使用默认postgres数据库。一套数据库实例内,不建议自定义超过3个database。4.5 【建议】模式命名规范默认建用户会生成同名schema,通过授权可以使其他用户访问schema下的数据对象。4.6 【建议】函数命名规范自定义函数,为避免函数重载,同名函数尽量只保留一个。存储过程以pro_开头,函数以func_开头,触发器以tri_开头。4.7 【建议】索引、约束命名规范唯一索引名为uk_字段名(或缩写);普通索引名则为idx_字段名(或缩写);用语主键的索引以pk_开头,外键约束以fk_开头,检查约束以ck_开头。唯一索引:uk_userid(user_id)普通索引:idx_uidstat(user_id,status)示例:参考代码(正例)4.8 【建议】视图命名规范视图命
5、名以v_为前缀。create view testdb.v_test_t1 as selecta.employee_id, a.last_namefrom testdb.test_t1 as a ;示例 1:参考代码(正例)示例 2:参考代码(反例)create view testdb.test_t1 as selecta.employee_id, a.last_namefrom testdb.test_t1 as a ;4.9 【建议】库表对象名使用小写数据库默认大小写不敏感。如果建表使用如下语句,即采用大写名但未带上双引号。create table TABLE_1(col int);示例 1:参考代码将被实际存储为table_1。如果建表采用如下语句,即采用大写名并带上双引号。create table TABLE_1(col int);示例 2:参考代码将被实际存储为TABLE_1,且后续使用此表,也必须带上双引号,否则会查不到所需对象。因此,为简便建表语句和使用,宜对象命名均使用小写。5 sql 开发规范sql开发是项目开发人员与数据库服务交互的纽带。为了提升sql开发的效率和便于
6、面向未来的长期维护,下面以sql语句类型及特定类型下常用或容易产生误解的sql给出开发规范。5.1 查询语句规范5.1.1 【强制】避免使用 select * 语句在查询编写时,宜明确列出查询涉及的所有字段,不能使用“SELECT *”这种写法。基于性能考虑,尽量减少查询输出列。5.1.2 【强制】避免类型隐式转换常量类型要与表、函数中定义的类型一致,避免涉及隐式类型转换。在插入、查询、删除时都需要注意操作的表字段类型,虽然有一些类型可以通过隐式转换兼容,不会报错,但是隐式转换有额外开销,还会导致索引失效。在需要数据类型转换(不同数据类型进行比较或转换)时,使用强制类型转换,以防隐式类型转换结果与预期不符。-id 列类型为 intselect col1,. from testdb.test_t1 where id=10;示例 1:参考代码(正例)示例 2:参考代码(反例)-id 列类型为 intselect col1,. from testdb.test_t1 where id=10;5.1.3 【建议】where 条件等号左边不做计算即使字段上已经建立了索引,但任何的计算、函数、类型
7、转换都可能导致执行计划不走索引,使得 sql效率低下。where子句中的过滤条件,尽量符合单边规则。即把字段名放在比较条件的一边,优化器在某些场景下会自动进行剪枝优化。形如col op expression,其中col为表的一个列,op为“=”“”的等比较操作符,expression为不含列名的表达式。select col1,. from testdb.test_t1 where id=9;selectid,from_image_id,from_person_id,from_video_idfromface_datawheretime current_timestamp(6) - 1 days:interval;示例 1:参考代码(正例)示例 2:参考代码(反例)select col1,. from testdb.test_t1 where id+1=10;select id, from_image_id, from_person_id, from_video_id from face_data where current_timestamp(6) - time 1 days:inte
8、rval;5.1.4 【建议】注意配置 search_path在访问表对象时带上schema前缀,可以避免因schema切换导致访问到非预期的对象。也可以通过配置对应用户、数据库的search_path达到目的。5.1.5 【强制】NULL 值比较NULL值的比较只能使用IS NULL或IS NOT NULL的方式判断,其他任何形式的逻辑判断都返回NULL。select col1,. from testdb.test_t1 where id is NULL;示例 3:参考代码(正例)示例 4:参考代码(反例)select col1,. from testdb.test_t1 where id = NULL;5.1.6 【建议】不使用左模糊搜索where子句使用like模糊查询时,如果%放在首字符位置并且查询的列上有索引,会导致字段无法使用上索引,如果表数据量大,走全表扫描会消耗大量cpu和i/o资源。如有需要,可用reverse表达式函数索引。select id from testdb.test_t1 where id like x%x%;示例 1:参考代码(正例)示例 2:参考代码(
9、反例)select id from testdb.test_t1 where id like %xx;5.1.7 【建议】使用等值操作代替不等值比较where子句中字段使用不等值比较时,无法使用字段上的索引优化性能。所以在满足业务需求的前提下,宜优先使用等值比较,或者范围比较。select col1 from testdb.test_t1 where test_id in(1,2,.,99,101,102,.150) ;示例 1:参考代码(正例)示例 2:参考代码(反例)select col1,. from testdb.test_t1 where test_id != 100;5.1.8 【建议】使用 UNION ALL 代替 UNION在保障业务逻辑准确的情况下,宜尽量使用UNION ALL来代替UNION。union 会把参与操作的两个结果集的所有数据放到临时表中进行去重和排序操作; union all 不会对结果集进行去重排序,因而可以省去临时表的操作提升效率。5.1.9 【建议】不同字段的 or 条件可用 union all 替换在保障业务逻辑准确的情况下,如果过滤条件只有OR表达式,可以将OR表达式转化为UNION ALL以提升性能。使用OR的sql语句经常无法优化,导致执行速度慢。SELECT * FROM
《2025openGauss数据库开发指南》由会员职**分享,可在线阅读,更多相关《2025openGauss数据库开发指南》请在金锄头文库上搜索。