PostgreSQL 模式

17 Mar 2025 | 6 分钟阅读

在本节中,我们将学习 PostgreSQL 模式、公共模式、PostgreSQL 如何使用模式搜索路径来解析模式中的对象、PostgreSQL 模式和权限以及使用 PostgreSQL 模式的优势

PostgreSQL 模式介绍

每个数据库都以一个模式开始,它应该是公共模式。模式是表的命名集合。

PostgreSQL Schema

模式是一个命名空间,它提供多个对象,例如:

  • 视图
  • 索引
  • 序列
  • Datatypes
  • 运算符
  • 函数
  • 其他关系。
PostgreSQL Schema

注意:PostgreSQL 模式是保存命名对象的命名空间。

PostgreSQL 模式中,我们可以通过在名称前加上模式名称作为前缀来访问模式的对象,如下所示:

或者,我们可以设置包含该模式的搜索路径,我们将在未来介绍模式搜索路径。

一个数据库可以有一个或多个模式,而每个模式仅存在于一个数据库中,并且两个模式可以包含共享相似名称的不同对象。

例如

假设我们有包含Employee 表Company 模式,并且公共模式也具有Employee 表。 当我们引用 Employee 表时,它应如下所示:

为什么我们需要在 PostgreSQL 中使用模式?

PostgreSQL 中,我们出于以下主要原因使用模式:

  • 最终用户只能使用允许将测试表和逻辑与生产表分离的那些模式。
  • 在模式中,我们可以有效地实现数据,并将其应用于以下一些活动:
    • 我们可以快速恢复存在于不同模式中的数据。因此,可以单独返回和备份面向应用程序的模式以进行恢复和时间旅行。
    • 当应用程序数据位于模式中时,我们可以管理应用程序更改。因此,应用程序的新版本可以在新模式中的表结构上工作,包括对模式名称的简单修改。
    • 我们可以轻松地备份存在于单独模式中的数据。因此,不稳定的数据可以有多个来自非易失性数据的备份计划。

因此,出于创建目的,我们可以将应用程序数据分开保存在模式高级管理中。 对于最终用户目的,我们可以通过踩踏对方的方式将我们的用户保留在不同的模式中。

公共模式

我们在 PostgreSQL 教程的早期主题中创建了表,而没有描述任何模式名称。 这些表和其他对象默认情况下会自动放入公共模式中。

对于每个新数据库,PostgreSQL 都会生成一个名为public的模式。 因此,以下命令是平行的:

PostgreSQL 模式搜索路径

  • 在 PostgreSQL 中,如果我们仅按名称选择一个表,则可以使用模式搜索路径的帮助来搜索该表。
  • PostgreSQL 将在模式搜索路径中提供对初始等效表的权限。 如果没有匹配项,它将引发错误,甚至该名称出现在数据库中的备用模式中。
  • 在 PostgreSQL 中,当前模式被称为搜索路径中的主模式。
  • 我们可以经常在模式搜索路径中引用没有模式名称的表。

例如

要访问 Employee 表,我们使用 company.Employee

注意

  • 如果我们创建一个没有描述模式名称的新对象,PostgreSQL 也会将当前模式用于新对象。
  • current_schema() 方法用于返回当前模式。

输出

在执行上述命令后,我们将获得以下输出

PostgreSQL Schema

注意:PostgreSQL 对我们在数据库中创建的每个新对象都使用 public。

我们可以使用下面的 SHOW 语句来查看当前的搜索路径。

输出

在执行上述命令后,我们将获得以下输出

PostgreSQL Schema

在上面的输出中

  • "$user" 定义了 PostgreSQL 将用于查找与当前用户具有相似名称的对象的第一个模式。
    例如
    如果我们使用 Postgres 用户登录并具有 Employee 表的权限。 在 Postgres 模式中,PostgreSQL 将搜索 Employee 表。 如果它找不到任何类似的对象,它将继续在 public 模式中搜索该对象。
  • 第二个组件指定为公共模式,正如我们之前所理解的。

要创建新模式,我们可以使用 CREATE SCHEMA 命令

输出

PostgreSQL Schema

要将新模式添加到搜索路径,我们可以使用以下语句:

输出

PostgreSQL Schema

如果我们创建一个没有描述模式名称的新表 Employee,则 PostgreSQL 会将此 Employee 表放入 Company 模式:

输出

PostgreSQL Schema

下面的屏幕截图显示了新模式 Company 和属于 Company 模式Employee 表:

PostgreSQL Schema

要访问 Company 模式中的 Employee 表,我们可以使用以下命令之一:

public 模式是搜索路径中的第二个组件;因此,要访问公共模式中的 Employee 表,我们应该在下面指定表名

一旦我们执行所有以上语句,我们将获得以下输出。

运行第一个命令后,我们将获得以下输出

PostgreSQL Schema

执行第二个命令后,我们将获得以下输出

PostgreSQL Schema

执行最后一个命令后,我们将获得以下输出

PostgreSQL Schema

执行所有三个命令后,我们将获得相同的输出,这就是为什么我们可以使用以上任何查询来访问 Company 模式中的员工表

注意:我们也可以删除公共模式,因为它不是唯一的模式。

PostgreSQL 模式和权限

用户只能有权访问他们在其中创建对象的模式,这意味着用户不能使用他们未创建的模式中的任何其他对象。

因此,我们必须授予用户使用权限以获得他们未创建的模式中所有对象的访问权限。

以下命令用于获取用户对模式的使用权限

要允许用户在他们不创建的模式中创建对象,我们必须授予他们 CREATE 权限

以下命令用于授予对模式的创建权限

注意:默认情况下,每个用户都具有对公共模式的 USAGE 和 CREATE 权限。

如果我们不想使用以下命令的帮助访问该权限,我们可以撤销该权限。

在这里,第一个 public 指的是 模式,第二个 public 指的是 每个用户

PostgreSQL 模式操作

  • 我们可以使用 CREATE SCHEMA 命令来创建新模式。
  • 我们可以使用 DROP SCHEMA 命令来删除模式。
  • 我们可以使用 ALTER SCHEMA 命令来重命名模式或修改所有者。

使用 PostgreSQL 模式的好处

该模式允许我们简化许多用户使用一个数据库,而无需相互涉及。 PostgreSQL 模式的一些常见优势如下:

  • 在 PostgreSQL 模式中,至关重要的优势是,如果一个数据库属于不同的模式,则该数据库可以具有相同的表名。
  • 模式可以将数据库对象分类为逻辑组,以使它们更易于控制。
  • 模式允许用户将一个数据库用作多个数据库的替代方案。
  • 为了避免与其他对象的名称冲突,我们可以将第三方模式放入不同的模式中。
  • 具有相似名称的对象只要放在不同的模式中就不会冲突。