更新时间:2025-03-13 GMT+08:00
Database和Schema设计规范
- 【说明】创建Database时,需要重点关注字符集编码(ENCODING)和兼容性(DBCOMPATIBILITY)两个配置项。GaussDB支持TD、ORA、MYSQL、PG、M五种兼容模式,分别表示兼容Teradata语法、Oracle语法、MySQL语法、POSTGRES语法和M-Compatibility语法,不同兼容模式下的语法行为存在一定差异,默认为MYSQL兼容模式。
- 【说明】Database的owner默认拥有该Database下所有对象的所有权限,包括删除权限。删除权限影响较大,请谨慎使用。
- 【说明】如果该用户不具有sysadmin权限或者不是该Schema的owner,要访问Schema下的对象,需要同时给用户授予Schema的usage权限和对象的相应权限。
- 【说明】如果要在Schema下创建对象,需要授予操作用户该Schema的CREATE权限。
- 【说明】Schema的owner默认拥有该Schema下对象的所有权限,包括删除权限。删除权限影响较大,请谨慎使用。
- 【规格】使用JDBC客户端连接数据库时必须指明数据库名。具体格式为:
jdbc:postgresql://ip:port/database_name
JDBC实例一旦创建,无法进行数据库切换。
- 【规格】数据库目前不支持不区分大小写的排序方式。
- 【规则】业务使用前必须由系统管理员为业务创建DATABASE、SCHEMA和USER,然后再赋予相关用户对应对象的权限。
- 【规则】业务使用前必须先创建业务数据库。禁止使用数据库安装后默认创建的postgres数据库存储业务数据,建议根据业务情况创建业务自己的数据库。
- 【规则】创建数据库时必须指定字符集为UTF8,创建数据库时必须选择与客户端统一的编码字符集。
为了满足全球化需求,数据库编码应能够存储与标识绝大多数的字符,因此推荐使用UTF8。UTF8字符集与MySQL的UTF8MB4等价,能够支持emoji表情字符。
如果客户端的编码方式与数据库的编码方式不统一,需要转码,会带来性能问题,同时,针对同编码的内核优化无法触发,影响查询效率。
客户端的编码字符集需通过以下方式修改:
- 设置客户端连接参数,例如JDBC连接参数可通过在URL中追加characterEncoding和allowEncodingChanges参数
jdbc:postgresql://ip:port/database_name?characterEncoding=utf8&allowEncodingChanges=true
- 修改数据库GUC参数
SET client_encoding = 'UTF8';
数据库的编码在CREATE DATABASE时进行设置。CREATE DATABASE tester WITH ENCODING = 'UTF8';
数据库一旦创建无法更改字符集。
- 设置客户端连接参数,例如JDBC连接参数可通过在URL中追加characterEncoding和allowEncodingChanges参数
- 【建议】一个集群内,用户自定义的Database数量推荐值为3个,不建议超过10个。用户自定义的Database数量过多会导致升级、备份等运维操作的效率降低。
- 【建议】实际用户环境中Schema数量不建议超过100个。当数据库中存在大量Schema时,会导致gs_dump等依赖Schema数量的操作性能变慢。
- 【建议】从便捷性和资源共享效率上考虑,建议使用SCHEMA进行业务隔离。
可以使用DATABASE和SCHEMA两种方式实现业务的隔离。区别在于:
- DATABASE方式隔离共享资源极少,可实现连接隔离、权限隔离等,隔离更加彻底。但DATABASE之间无法互相访问,JDBC建连时必须指明DATABASE,连接后无法切换DATABASE。
- SCHEMA方式隔离共用资源较多,可以通过GRANT与REVOKE语法便捷地控制不同用户对各SCHEMA及其下属对象的权限。
- 【建议】创建数据库时建议指定LC_CTYPE和LC_COLLATE,该参数将影响数据的排序顺序。
CREATE DATABASE SAMPLE_DB WITH LC_CTYPE = 'zh_CN.gbk' LC_COLLATE = 'zh_CN.gbk';
父主题: 数据库设计规范