35. PostgreSQL 模式¶
生产数据库不可避免地会包含大量表格和视图,将它们全部管理在一个模式中很快就会变得难以管理。幸运的是,PostgreSQL 包含“_模式”的概念。
模式就像文件夹,可以包含表格、视图、函数、序列和其他关系。每个数据库都从一个模式开始,即 public
模式。
在该模式中,PostGIS 的默认安装会创建 geometry_columns
、geography_columns
和 spatial_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;
这确保了对关系和函数的所有引用都在 census
和 public
模式中搜索。请记住,所有 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
搜索路径上的第一个模式是用户的命名模式!所以现在存在以下条件
用户存在,并且具有创建空间表的能力。
用户的命名模式存在,并且用户拥有它。
用户的搜索路径首先包含用户模式,因此新表会自动创建在那里,并且查询也会自动首先在那里搜索。
这就是全部,用户的默认工作区现在已很好地与其他模式中的任何表隔离开来。