在高斯数据库(GaussDB,特别是基于 openGauss 内核的版本)中,**Database(数据库)** 和 **Schema(模式)** 是两个不同层级、具有不同隔离性和管理目标的概念。

 

1. **隔离性:**

    * **Database 提供强隔离:** 物理存储隔离,默认逻辑访问隔离(跨库访问困难),是独立的权限管理单元。适合隔离不同应用或租户。

    * **Schema 提供弱隔离(逻辑分组):** 无物理隔离,逻辑上通过命名空间隔离(需指定模式名或设置路径),但 SQL 可轻松跨 Schema 访问。是更细粒度的权限控制单元。适合在同一个应用内组织模块。

 

2. **访问方式:**

    * 访问一个对象,通常需要指定其 **完全限定名**:`database_name.schema_name.object_name`。但在实际连接中:

        * 连接时指定了 `database_name`。

        * 在会话中访问对象时,通常只需要 `schema_name.object_name`(或依赖 `search_path` 只写 `object_name`)。

    * 跨 Database 访问需要特殊机制(如 **Foreign Data Wrappers (FDW)** 或应用层处理)。

 

3. **管理与运维:**

    * **备份/恢复、资源管理、用户权限(如 `CONNECT`)** 通常在 **Database 级别** 操作。

    * **对象权限(`SELECT`, `INSERT`, `USAGE` on schema, etc.)** 可以在 **Database、Schema 或单个对象级别** 精细控制。`CREATE` 权限可以在 Schema 级别授予。

 

**举例说明:**

 

假设你有一个电商平台:

 

1. **创建两个 Database:**

    * `ecommerce_prod`: 生产环境的主业务数据库。

    * `ecommerce_report`: 专门用于存放从 `ecommerce_prod` 同步过来的数据,供报表和分析系统使用。

    * *这两个 Database 是物理隔离的。报表系统连接 `ecommerce_report`,无法直接查询 `ecommerce_prod` 里的表(除非配置 FDW)。*

 

2. **在 `ecommerce_prod` Database 内创建多个 Schema:**

    * `public`: (默认存在) 可能放一些通用配置表或临时测试。

    * `core`: 存放核心业务表,如用户 (`users`)、商品 (`products`)、订单 (`orders`)。

    * `finance`: 存放支付 (`payments`)、发票 (`invoices`) 相关表。

    * `inventory`: 存放库存 (`stock`)、仓库 (`warehouses`) 相关表。

    * `analytics`: 存放物化视图、聚合表等,供内部分析使用。

    * *业务应用程序连接 `ecommerce_prod`。一个查询可以轻松地 JOIN `core.orders` 表和 `finance.payments` 表(因为它们同属一个 Database)。开发团队 A 负责 `core`,团队 B 负责 `finance`,他们可以在各自 Schema 下创建名为 `config` 的表而不会冲突 (`core.config` vs `finance.config`)。可以给财务角色授予 `finance` Schema 的 `USAGE` 和 `SELECT` 权限。*

 

* **Database = 独立的应用或数据集。** 选择连接哪个 Database 决定了你进入哪个“世界”。

* **Schema = 同一个应用内的逻辑模块/分类。** 进入一个“世界”(Database)后,里面的东西被分门别类放在不同的“房间”(Schema)里,你可以自由进出这些房间访问里面的物品(对象)。

 

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐