數據庫、模式、表的關係(轉載)

模式與數據庫、數據庫中的表的關係:
1個數據庫下,可以有多個模式。 

1個模式下,可以有0個或多個表 。 

  首先我來做一個比喻,什麼是User,什麼是Database,什麼是Schema,什麼是Table,什麼是列,什麼是行,? 

  我們可以把Database看作是一個大倉庫,倉庫分了很多很多的房間,Schema就是其中的房間一個Schema代表一個房間Table可以看作是每個Schema中的,Table就被放入每個房間中,不能放置在房間之外。然後牀上可以放置很多物品,就好比Table上可以放置很多列和行一樣。所以Schema包含的是Object,而不是User。

  User是每個對應數據庫的主人,既然有操作數據庫的權利,就肯定有操作數據庫中每個Schema(房間)的權利。換句話說,如果他是某個倉庫的主人,那麼這個倉庫的使用權和倉庫中的所有東西都是他的,他有完全的操作權,。我們還可以給User分配具體的權限,也就是他到某一個房間能做些什麼,是隻能看(Read-Only),還是可以像主人一樣有所有的控制權(R/W),這個就要看這個User所對應的角色Role了,至於分配權限的問題,後面章節有介紹。

  在SQL Server2005中,當我們用Create User創建數據庫用戶時,我們可以爲該用戶指定一個已經存在的Schema作爲默認Schema,如果我們不指定,則該用戶所默認的Schema即爲dbo 模式,dbo 房間(Schema)好比一個大的公共房間,在當前登錄用戶沒有默認Schema的前提下,如果你在大倉庫中進行一些操作,比如Create Tabe,如果沒有指定特定的房間(Schema),那麼你的物品就只好放進公共的dbo房間(Schema)了。但是如果當前登錄用戶有默認的Schema,那麼所做的一切操作都是在默認Schema上進行(比如當前登錄用戶爲login1。 

  在SQL Server2005中創建一個數據庫的時候,會有一些Schema包括進去,被包括進去的Schema有:dbo,INFORMATION_SCHEMA, guest,sys等等。 

   我在上文中已經提到了,在SQL Server2005中當用存儲過程sp_adduser創建一個user時,同時SQL Server2005也爲我們創建了一個默認的和用戶名相同的Schema,這個時候問題出來了,當我們create table A時,如果沒有特定的Schema做前綴,這個A表創建在了哪個Schema上,即進入了哪個房間?答案是: 

   1.如果當前操作數據庫的用戶有默認的Schema(在創建用戶的時候指定了),那麼表A被創建在了默認的Schema上。 

  2.如果當前操作數據庫的用戶沒有默認的Schema(即在創建User的時候默認爲空),那麼表A被創建在了dbo Schema上,即使有一個和用戶名同名的Schema存在,由於它不是該用戶默認的Schema,所以創建表的時候是不會考慮的,當作一般的Schema來處理,別看名字相同,可是沒有任何關係哦。 

   3.如果在創建表A的時候指定了特定的Schema做前綴,則表A被創建在了指定的 Schema上。 

  在這裏,爲了避免混淆和提高操作數據庫的速度,我們最好每次在操作數據庫對象的時候都顯式地指定特定的Schema最爲前綴。現在如果登錄的用戶爲Sue,該用戶有一個默認Schema也爲Sue,那麼如果現在有一條查詢語句爲Select * from mytable, 那麼搜尋每個房間(Schema)的順序是怎樣的呢?順序如下: 

   1. 首先搜尋sys.mytable (Sys Schema) 

   2. 然後搜尋Sue.mytable (Default Schema) 

   3. 最後搜尋 dbo.mytable (Dbo Schema) 

  執行的順序大家既然清楚了,那麼以後在查詢數據庫表中的數據時,最好指定特定的Schema前綴,這樣子,數據庫就不用去掃描Sys Schema了,當然可以提高查詢的速度了。 

  另外需要提示一下的是,每個數據庫在創建後,有4個Schema是必須的(刪都刪不掉),這4個Schema爲:dbo,guest,sys和INFORMATION_SCHEMA,其餘的Schema都可以刪除。

爲什麼把表歸屬於不同的模式裏?
  例如你的數據庫裏面有很多的表。就以一個學校作爲例子吧: 

  有很多表分別用於存儲學生、課程、成績、學分等信息。 

  還有很多表用於存儲 老師、工資、獎金等信息。 

  還有很多表用於存儲學校的固定資產、流動資產、財務相關信息。

  如果這麼多的表,都混雜在一起。管理起來非常麻煩。

  通過 create schema , 劃分區域,

   把學生的,創建一個 schema 叫 Student

  教師的,創建一個 schema 叫 Teacher 

  學校財務的,創建一個 schema 叫 School 

  這樣,對於專門負責學生信息管理的,就只負責 Student 這個 schema,表名全部是 Student.具體表名。 

  對於,負責教師系統開發的人來說,程序裏面的表名,都是Teacher.具體表名。 

  學校財務的也是一樣,查詢的時候,是:SELECT * FROM School.具體表名

 

摘自:https://wenku.baidu.com/view/4e994735f111f18583d05a27.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章