GaussDB(DWS) 特殊对象名

举报
剑圣 发表于 2021/03/29 16:28:26 2021/03/29
【摘要】 在数据库使用过程中,数据库对象名不仅限于英文字母、数字和上下划线,因而数据库表的可读性会产生可读性差,表字段规则不统一等问题,造成数据查询,数据使用效率低下。


一些常见的特殊对象名

含$:没有什么特殊含义,oracle内部表或临时表一般这样命名。其他数据库的管理员可能遵从这种命名习惯。

含@:在oracle中的dblink,访问远程数据库中的表名, 如tablename@dbserver。而表名本身含有@,需要将@用双引号括起来。

含有大写字母:数据库默认会将大写字母转为小写,对象名含有大写字母的需要用双引号括起来。

首字母为数字:以数字为开头的对象名

中文字符:含中文字符的对象名,可读性强但是需要注意编程语言的编解码格式。

含有不同特殊字符名的数据库对象,在创建时行为可能有所不同

创建以$开头的表名:

my.png

创建含有$的表名,此时没有用双引号括起来:

my2.png

创建含有$的表名,此时用双引号括起来:

my3.png



由此可见,表名中含有$符号,是否用双引号括起来行为都保持一致。而创建一个含有@字符的表名,或首字母为数字,如下图所示,则必须用双引号括起来:

at1.png

at2.png

at3.png



含中文字符的场景,无需加双引号。

zw.png




在开发过程中,程序员往往可以使用regclass来获取唯一的表名,regclass是数据库中oid的别名,如tablename::regclass,此时数据库返回的表名会默认自动加上双引号。

regclass.png

regclass的内核处理逻辑是字符中除英文字母(小写)开始含下划线的表名,都默认加双引号返回,与数据库表名的创建逻辑并不完全一致,并且其处理效率为线性增长。因此,在使用regclass的sql开发过程中,需要根据效率要求以及一致性需求来进行开发,中文字符,下划线开头等场景可以不用加双引号进行处理,而其他特殊字符却需要加双引号才能正确识别。

 

二义性

在备份工具Roach的使用过程中,特殊表名的使用需要加上双引号,而因为python语言会默认将双引号 包围的字符串直接透传,导致传入的字符串两侧并没有双引号,例如“public.test”传入后实际为‘public.test’,单表备份恢复要将双引号传入需要两侧再加‘’,如‘“public.test”’。

总结上述场景,含有特殊字符的 表名使用过程中均可以加上双引号,但因此却带来了一些二义性问题,例如:

我们在使用数据库表名时,往往加上schema名,例如public.test,此时‘.’ 为分隔符。而数据库表名也可以包含‘.’,如下图,这里表示创建表名称为public.test的表名。

test1.png

而在数据库使用过程中,数据库对象也可以以‘.’命名。

schema.png

这些使用方法在实际过程中,会大大降低易用性与效率。因而制定一套符合公司习惯的对象名命名规范是即为必要的,推荐数据库管理员指定符合自身习惯的对象名命名规范。

 

推荐使用规范

数据库对象名规范,例:

  1. 采用26个英文字母(区分大小写)0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔
  2. 全部小写命名,禁止出现大写
  3. 禁止使用数据库关键字,如nametime datetimepassword
  4. 表名称不应该取得太长(一般不超过三个英文单词)
  5. 表的名称一般使用名词或者动宾短语
  6. 用单数形式表示名称,例如,使用 employee,而不是 employees

字段命名规范可以参考对象名规范

 

总结

为保证应用效率,特殊对象名对于数据库软件开发与使用,推荐制定对象名命名规范并严格遵守;对于内核及数据库平台开发,对于特殊对象名的处理需要保持前后一致性及处理效率。

1613612973412009538.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。