35. PostgreSQL 模式

生产数据库不可避免地会包含大量表格和视图,将它们全部管理在一个模式中很快就会变得难以管理。幸运的是,PostgreSQL 包含“_模式”的概念。

模式就像文件夹,可以包含表格、视图、函数、序列和其他关系。每个数据库都从一个模式开始,即 public 模式。

_images/schemas.jpg

在该模式中,PostGIS 的默认安装会创建 geometry_columnsgeography_columnsspatial_ref_sys 元数据关系,以及 PostGIS 使用的所有类型和函数。因此,PostGIS 用户始终需要访问 public 模式。

在 public 模式中,您还可以看到我们在研讨会中创建的所有表格。

35.1. 为什么要使用模式?

使用模式有两个非常好的理由

  • 在模式中管理的数据更容易应用批量操作。

    • 备份位于单独模式中的数据更容易:因此,易变数据可以与非易变数据具有不同的备份计划。

    • 恢复位于单独模式中的数据更容易:因此,面向应用程序的模式可以单独恢复和备份,以进行时间旅行和恢复。

    • 当应用程序数据位于模式中时,管理应用程序差异更容易:因此,新版本的软件可以在新模式中的表格结构中工作,并且切换涉及对模式名称的简单更改。

  • 可以限制用户的工作范围,使其只能访问单个模式,从而将分析和测试表与生产表隔离。

因此,出于生产目的,将应用程序数据在模式中分开可以提高管理效率;而对于用户而言,将用户置于不同的模式中可以防止他们互相干扰。

35.2. 创建数据模式

让我们创建一个新的模式并将一个表移入其中。首先,在数据库中创建一个新的模式

CREATE SCHEMA census;

接下来,我们将 nyc_census_blocks 表移到 census 模式中

ALTER TABLE nyc_census_blocks SET SCHEMA census;

如果您使用的是 psql 命令行程序,您会注意到 nyc_census_blocks 现在已从您的表列表中消失了!如果您使用的是 PgAdmin,您可能需要刷新视图才能看到新的模式及其内部的表。

您可以通过两种方式访问模式内的表

  • 使用 schema.table 符号引用它们

  • 将模式添加到您的 search_path

显式引用很简单,但长时间打字会让人厌烦

SELECT * FROM census.nyc_census_blocks LIMIT 1;

操作 search_path 是一种很好的方法,可以访问多个模式中的表,而无需大量额外的输入。

您可以使用 SET 命令在运行时设置 search_path

SET search_path = census, public;

这确保了对关系和函数的所有引用都在 censuspublic 模式中搜索。请记住,所有 PostGIS 函数和类型都在 public 中,因此我们不希望将其从搜索路径中删除。

每次连接时都设置搜索路径也会让人厌烦,但幸运的是,可以永久地为用户设置搜索路径

ALTER USER postgres SET search_path = census, public;

现在,postgres 用户将始终在其搜索路径中包含 census 模式。

35.3. 创建用户模式

用户喜欢创建表,PostGIS 用户尤其如此:使用 SQL 进行分析操作需要临时表来进行可视化或中间结果,因此空间 SQL 往往要求用户拥有比普通数据库工作负载更多的 CREATE 权限。

默认情况下,Oracle 中的每个角色都会获得一个个人模式。这对 PostgreSQL 用户来说也是一个很好的做法,并且使用 PostgreSQL 角色、模式和搜索路径很容易复制。

创建一个具有创建表权限的新用户(有关 postgis_writer 角色的信息,请参阅 PostgreSQL 安全),然后使用该用户作为授权创建模式。

CREATE USER myuser WITH ROLE postgis_writer;
CREATE SCHEMA myuser AUTHORIZATION myuser;

如果你以该用户身份登录,你会发现 PostgreSQL 的默认 search_path 实际上是这个

show search_path;
  search_path
----------------
 "$user",public

搜索路径上的第一个模式是用户的命名模式!所以现在存在以下条件

  • 用户存在,并且具有创建空间表的能力。

  • 用户的命名模式存在,并且用户拥有它。

  • 用户的搜索路径首先包含用户模式,因此新表会自动创建在那里,并且查询也会自动首先在那里搜索。

这就是全部,用户的默认工作区现在已很好地与其他模式中的任何表隔离开来。