綱要 (資料庫)

-{T|zh-tw: 綱要 (資料庫); zh-cn:架构 (数据库); zh-hk: 架構 (資料庫)}-

-{zh-tw: 綱要; zh-hk: 架構; zh-hans: 架构}-（-{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的數據在物理上如同其他表空間的內容一樣，儲存在表空間所屬的其中一個裡。部分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模型
 知识表示

外部链接 
 Tip/Trick: Online Database Schema Samples Library 
 Database Schema Samples
 Designing the Star Schema Database

数据管理
数据建模