
# 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
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  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';
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  数据库一旦创建无法更改字符集。
  
- 【建议】一个集群内，用户自定义的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';
  ```
  
 
