綱要 (資料庫)

-{T|zh-tw: 綱要 (資料庫); zh-cn:架構 (數據庫); zh-hk: 架構 (資料庫)}-
-{zh-tw: 綱要; zh-hk: 架構; zh-hans: 架構}-（Schema-{zh-hk: ，又稱模式; zh-hans: ，又稱模式}-），-{zh-tw: 香港和中國大陸翻譯為模式或架構; zh-hk: 臺灣翻譯為綱要; zh-hans: 臺灣翻譯為綱要}-，在數據庫系統中是形式語言描述的一種結構，是對象的集合，可包含各種對象如：表、字段、關係模型、視圖、索引、包、存儲過程、子程序、隊列、觸發器、數據類型、序列、物化視圖、同義詞（synonym）、database link、directory、XML schema等。
模式的益處：- 允許多個用戶使用一個數據庫而不會干擾其它用戶。- 把數據庫對象組織成邏輯組，讓它們更便於管理。- 第三方的應用可以放在不同的模式中，不會和其它對象的名字衝突。

**Oracle數據庫實現**
在Oracle數據庫中，schema object是一類邏輯數據庫存儲結構。
Oracle的數據庫會為每個在數據庫的用戶關聯一個獨立的schema。
schema包括有一堆schema objects的集合。schema objects的例子包括有：- 數據庫表- 視圖- 序列- 異名- 數據庫索引- 數據庫叢集- 數據庫連結- 快照- 存儲程序- functions- packages
與此同時，非schema objects可能包括：- users- roles- contexts- directory objects
Schema objects跟磁碟上用來儲存資料的物理檔案並沒有一對一的關連。不過，Oracle數據庫會將schema objects以虛擬的邏輯形式儲存在數據庫的表空間裡。每一件schema object的數據在物理上如同其他表空間的內容一樣，儲存在表空間所屬的其中一個datafile裡。部分objects（例如：表、索引、叢集等）所佔的空間，數據庫管理員可控制Oracle的RDBMS可如何在表空間的datafile內如何分配與schema object。
schemas與表空間之間沒有必然的關係：表空間可以包含來自不同schema的objects，並且單個schema的object可以位於不同的表空間中。

**SQL Server數據庫實現**
SQL Server數據庫把schema譯作“架構”。架構是數據庫中對象的容器。架構是形成單個命名空間的數據庫實體的集合。命名空間是一個集合，其中每個元素的名稱都是唯一的。默認架構DBO。訪問默認架構中的對象時，不需要指定架構的名稱。微軟建議使用兩段式對象名稱：
架構名.對象名
創建架構的語句舉例：
CREATE SCHEMA mySchema AUTHORIZATION user1
CREATE TABLE myTable1(source int, cost int, partnumber int)
GRANT SELECT TO user2
Deny SELECT TO AnotherUser3;
上述語句創建一個架構mySchema，所有者為user1，包含表myTable1，授予user2以SELECT權限，拒絕給AnotherUser3以SELECT權限。
授予/撤銷用戶對架構的所有權：
GRANT INSERT ON SCHEMA ::mySchema1 To myUser2;
REVOKE INSERT ON SCHEMA ::mySchema1 To myUser2;
把對象從一個架構移動到另一個架構（必須同個數據庫）：
ALTER SCHEMA mySchema2 TRANSFER mySchema1.myTable1;
刪除一個架構，該架構不能包含對象：
DROP SCHEMA mySchema3;

**歷史**
在 SQL Server 2000 中，數據庫用戶和架構是隱式同一。每個數據庫用戶都是與該用戶同名的架構的所有者。對象的所有者在功能上與包含它的架構所有者相同。因而，SQL Server 2000 中的完全限定名稱的“架構”也是數據庫中的用戶。
SQL Server 2005 中，架構獨立於創建它們的數據庫用戶而存在。多個用戶可以共享一個默認架構進行統一的名稱解析。 刪除數據庫用戶不需要重命名該用戶架構所包含的對象。完全限定的對象名稱現在包含四部分：server.database.schema.object。如果未定義DEFAULT_SCHEMA 選項設置和更改默認架構，則數據庫用戶將把 dbo 作為其默認架構。

**MySQL數據庫實現**
MySQL 中 Schema 等價於 數據庫。
CREATE SCHEMA是CREATE DATABASE的同義詞。 

**PostgreSQL數據庫實現**
PostgreSQL數據庫集群可以有一個或多個命名的數據庫。用戶和用戶組在整個集群的範圍內是共享的，即不能有同名用戶。任何給定的客戶連接（connection）都只能訪問一個數據庫。 
一個數據庫包含一個或多個命名的模式， 模式包含其它命名的對象，如表、數據類型、函數、操作符等。在不同的模式裡使用同名的對象不會導致衝突。例如，schema1 和 schemaA 都可以包含叫做 mytable 的表。一個用戶可以訪問所連接的數據庫中的任意模式中的對象，只要有這個權限。

**Apache Derby數據庫實現**
Apache Derby數據庫（即Java DB）的任何connection的當前schema，默認是對應於該用戶名的一個schema。如果無用戶名被提供，那麼當前用戶名與當前schema缺省是APP。
但即使當前schema被設置為用戶名，這個schema仍然可能不存在。一個schema只能被創建：通過CREATE SCHEMA語句顯式創建或者創建一個對象（例如表等）來隱式創建。
APP schema總是存在，不需要創建。
如果你的程序試圖訪問當前schema但該schema下沒有創建任何對象，就會遇到“schema not exists”錯誤。

**SQL實現**
ISO/IEC 9075-1 SQL標準中將schema定義為描述符的持久命名集合（a persistent, named collection of descriptors）。
創建一個schema:
create schema demo_schema;
在指定模式裡創建表：
CREATE TABLE myschema.mytable (
...
);
刪除一個空的schema：
drop schema myschema;
刪除一個模式以及模式裡面所有的對象：
drop schema MySchema CASCADE;
默認的pulic schema：創建表時，如果沒有指定schema，則會自動被歸屬到數據庫的“public”的模式中。下面兩種創建表的方式是等效的：
CREATE TABLE tableName(...);
CREATE TABLE public.tableName(...);

**模式的權限**
用戶默認是看不到模式中不屬於他們所有的對象。
模式權限：
*USAGE 權限
*CREATE 權限：在別人的模式裡創建對象。缺省時，每個用戶在 public 模式上有 CREATE 權限。撤銷這個權限：REVOKE CREATE ON public FROM PUBLIC; （第一個 "public" 是模式，第二個 "public" 意思是"所有用戶"。 第一句裡它是個標識符，而第二句裡是個關鍵字，所以有不同的大小寫）

**模式搜索路徑**
系統使用一個模式的列表作為搜索路徑來解析一個表屬於哪個模式。搜索路徑中的第一個模式是當前模式；CREATE TABLE 沒有聲明模式名的時候，新建的表屬於當前模式。
查看搜索路徑：
SHOW search_path; 'PostgreSQL數據庫
設置搜索路徑
SET search_path TO myschema,public; 'PostgreSQL數據庫

**參考文獻**

**參看**
 數據元- 數據映射- 數據庫設計- ER模型- 知識表示- Object-role modeling- Schema matching- Three-schema approach

**外部鏈接**
  Tip/Trick: Online Database Schema Samples Library date=20210330142537 -  Database Schema Samples-  Designing the Star Schema Database