37. PostgreSQL 綱要

生產資料庫不可避免地會擁有大量的表格和檢視表,將它們全部放在一個綱要中管理很快就會變得難以處理。幸好,PostgreSQL 包含了「綱要」的概念。

綱要就像資料夾,可以包含表格、檢視表、函式、序列和其他關係。每個資料庫都從一個綱要開始,也就是 public 綱要。

_images/schemas.jpg

在這個綱要中,PostGIS 的預設安裝會建立 geometry_columnsgeography_columnsspatial_ref_sys 元數據關係,以及 PostGIS 使用的所有類型和函式。因此,PostGIS 的使用者始終需要存取 public 綱要。

在 public 綱要中,您還可以查看我們在研討會中到目前為止建立的所有表格。

37.1. 為何使用綱要?

使用綱要有兩個非常好的理由

  • 在綱要中管理的資料更容易套用大量操作。

    • 備份位於獨立綱要中的資料更容易:因此,不穩定的資料可以擁有與非不穩定資料不同的備份排程。

    • 還原位於獨立綱要中的資料更容易:因此,以應用程式為導向的綱要可以針對時間旅行和復原分別還原和備份。

    • 當應用程式資料位於綱要中時,更容易管理應用程式差異:因此,新版本的軟體可以在新綱要中處理表格結構,而切換只涉及簡單地變更綱要名稱。

  • 可以限制使用者在單個綱要中工作,以將分析和測試表格與生產表格隔離。

因此,對於生產目的,將您的應用程式資料分開放在綱要中有助於管理;而對於使用者目的,將您的使用者分開放在不同的綱要中可以防止他們互相干擾。

37.2. 建立資料綱要

讓我們建立一個新的綱要並將一個表格移入其中。首先,在資料庫中建立一個新的綱要

CREATE SCHEMA census;

接下來,我們會將 nyc_census_blocks 表格移至 census 綱要

ALTER TABLE nyc_census_blocks SET SCHEMA census;

如果您使用 psql 命令列程式,您會注意到 nyc_census_blocks 現在已從您的表格清單中消失!如果您使用 PgAdmin,您可能需要重新整理檢視以查看新的綱要及其中的表格。

您可以使用兩種方式存取綱要中的表格

  • 使用 綱要.表格 標記法參考它們

  • 將綱要新增至您的 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 綱要。

37.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

搜尋路徑中的第一個綱要是使用者命名的綱要!因此,現在存在以下條件

  • 使用者存在,並且具有建立空間表格的能力。

  • 使用者命名的綱要存在,並且使用者擁有它。

  • 使用者的搜尋路徑首先具有使用者綱要,因此新的表格會自動建立在此處,且查詢也會自動首先在此處搜尋。

就是這樣,使用者預設的工作區域現在已與其他綱要中的任何表格完美分離。