（英語：），，在数据库系统中是形式语言描述的一种结构，是对象的集合，可包含各种对象如：表、字段、关系模型、视图、索引、包、存储过程、子程序、队列、触发器、数据类型、序列、物化视图（英语：）、同义词（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数据库
```

参考文献
----

1. ↑  Pottinger, P.; Berstein, P.. New York, NY: ACM. 2008: 73–84. CiteSeerX 10.1.1.405.2990 可免费查阅. ISBN 9781595939265. doi:10.1145/1353343.1353357.  `|journal=`被忽略 (帮助)
2. ↑  Rybinski, H.. ACM Transactions on Database Systems. 1987, **12** (3): 325–349. doi:10.1145/27629.27630.
3. ↑  Imielinski, T.; Lipski, W.. New York, NY: ACM. 1982: 8–14. ISBN 978-0897910736. doi:10.1145/582353.582356.  `|journal=`被忽略 (帮助)
4. ↑  Ashdown, Lance; Kyte, Tom.. *et al*. Oracle Corporation. 2010-02  [2010-04-14]. （原始内容存档于2010-01-29）. A database schema is a logical container for data structures, called schema objects. Examples of schema objects are tables and indexes.
5. ↑ .  [2012-11-26]. （原始内容存档于2019-05-07）. A schema is a collection of logical structures of data, or schema objects. A schema is owned by a database user and has the same name as that user. Each user owns a single schema. Schema objects can be created and manipulated with SQL.（schema是数据或模式对象的逻辑结构的集合，由数据库用户拥有，并且与该用户具有相同的名称，也就是说每个用户拥有一个独立的schema。）
6. ↑  Ashdown, Lance; Kyte, Tom.. et al. Oracle Corporation. February 2010  [2010-04-14]. （原始内容存档于2010-01-29）. Other types of objects are also stored in the database and can be created and manipulated with SQL statements but are not contained in a schema. These objects include database users, roles, contexts, and directory objects.
7. ↑ .  [2018-08-03]. （原始内容存档于2021-04-13）.
8. ↑ .  [2018-08-03]. （原始内容存档于2020-08-25）.

參看
--

* 数据元
* 數據映射（英语：）
* 數據庫設計（英语：）
* ER模型
* 知识表示
* Object-role modeling（英语：）
* Schema matching（英语：）
* Three-schema approach（英语：）

外部链接
----

* Tip/Trick: Online Database Schema Samples Library （页面存档备份，存于）
* Database Schema Samples
* Designing the Star Schema Database