架構 (資料庫)

架構(英語:Schema,又稱模式),台灣翻譯為綱要,在數據庫系統中是形式語言描述的一種結構,是對象的集合,[1]可包含各種對象如:字段關係模型視圖索引存儲過程子程序隊列觸發器數據類型序列物化視圖英語materialized view同義詞(synonym)、database link、directoryXML schema等。[2][3]

模式的益處:

  • 允許多個用戶使用一個數據庫而不會干擾其它用戶。
  • 把數據庫對象組織成邏輯組,讓它們更便於管理。
  • 第三方的應用可以放在不同的模式中,不會和其它對象的名字衝突。

Oracle數據庫實現 編輯

Oracle數據庫中,schema object是一類邏輯數據庫存儲結構英語Database storage structures[4]

Oracle的數據庫會為每個在數據庫的用戶關聯一個獨立的schema。[5]

schema包括有一堆schema objects的集合。schema objects的例子包括有:

與此同時,非schema objects可能包括[6]

  • users
  • roles
  • contexts
  • directory objects

Schema objects跟磁碟上用來儲存資料的物理檔案並沒有一對一的關連。不過,Oracle數據庫會將schema objects以虛擬的邏輯形式儲存在數據庫的表空間裏。每一件schema object的數據在物理上如同其他表空間的內容一樣,儲存在表空間所屬的其中一個datafile英語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 等價於 數據庫。[7]

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」錯誤。[8]

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. Schema merging and mapping creation for relational sources. New York, NY: ACM. 2008: 73–84. CiteSeerX 10.1.1.405.2990 . ISBN 9781595939265. doi:10.1145/1353343.1353357.  |journal=被忽略 (幫助)
  2. ^ Rybinski, H. On First-Order-Logic Databases. ACM Transactions on Database Systems. 1987, 12 (3): 325–349. doi:10.1145/27629.27630. 
  3. ^ Imielinski, T.; Lipski, W. A systematic approach to relational database theory. New York, NY: ACM. 1982: 8–14. ISBN 978-0897910736. doi:10.1145/582353.582356.  |journal=被忽略 (幫助)
  4. ^ Ashdown, Lance; Kyte, Tom. Oracle Database Concepts 11g Release 2 (11.2). 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. ^ Oracle Database Concepts 10g Release 2 (10.2)Part Number B14220-02. [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. Oracle Database Concepts 11g Release 2 (11.2). 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. ^ 《MySQL 5.7 Reference Manual》,“MySQL Glossary”: In MySQL, physically, aschema is synonymous with adatabase. You can substitute the keywordSCHEMA instead ofDATABASE in MySQL SQL syntax, for example using CREATE SCHEMA instead of CREATE DATABASE.. [2018-08-03]. (原始內容存檔於2021-04-13). 
  8. ^ [[Apache Derby]]数据库(即[[Java DB]]) Frequently Asked Questions 5.3. Why do I get the error 'schema does not exist'?. [2018-08-03]. (原始內容存檔於2020-08-25). 

參看 編輯

外部連結 編輯