資料庫Schema概念
在學習SQL的過程中,會遇到一個讓你迷糊的Schema的概念。實際上,schema就是資料庫物件的集合,這個集合包含了各種物件如:表、檢視、儲存過程、索引等。為了區分不同的集合,就需要給不同的集合起不同的名字,預設情況下一個使用者對應一個集合,使用者的schema名等於使用者名稱,並作為該使用者預設schema。所以schema集合看上去像使用者名稱。
如果把database看作是一個倉庫,倉庫很多房間(schema),一個schema代表一個房間,table可以看作是每個房間中的儲物櫃,user是每個schema的主人,有操作資料庫中每個房間的權利,就是說每個資料庫對映的user有每個schema(房間)的鑰匙。
我們訪問一個表時,沒有指明該表屬於哪一個schema中的,系統就會自動給我們在表上加上預設的sheman名。在資料庫中一個物件的完整名稱為schema.object,而不屬user.object。
在MySQL中建立一個Schema和建立一個Database的效果好像是一樣的,但是在sqlserver和orcal資料庫中效果又是不同的。
在SQL Server 2000中,user和schema總有一層隱含的關係,讓我們很少意識到其實user和schema是兩種完全不同的概念,假如我們在某一資料庫中建立了使用者Bosco,那麼此時後臺也為我們預設的建立了schema【Bosco】,schema的名字和user的名字相同。
在SQL Server 2005中,為了向後相容,當用sp_adduser儲存過程建立一個使用者的時候,sqlserver2005同時也建立了一個和使用者名稱相同的schema,然而這個儲存過程是為了向後相容才保留的,當我們用create user建立資料庫使用者時,我們可以用該使用者指定一個已經存在的schema作為預設的schema,如果我們不指定,則該使用者所預設的schema即為dbo schema,dbo房間(schema)好比一個大的公共房間,在當前登入使用者沒有預設schema的前提下,如果你在大倉庫中進行一些操作,比如create table,如果沒有制定特定的房間(schema),那麼你的物品就只好放進公共的dbo房間(schema)了。但是如果當前登入使用者有預設的schema,那麼所做的一切操作都是在預設的schema上進行。
在Oracle資料庫中不能新建一個schema,要想建立一個schema,只能通過建立一個使用者的方法解決,在建立一個使用者的同時為這個使用者建立一個與使用者名稱同名的schem並作為該使用者的預設shcema。即schema的個數同user的個數相同,而且schema名字同user名字一一 對應並且相同。
資料庫中的Schema
突然想到資料庫中的schema是什麼,於是多方搜尋有了基本瞭解,做一個簡單記錄:
在SQL環境下,schema就是資料庫物件的集合,所謂的資料庫物件也就是常說的表,索引,檢視,儲存過程等。
在schema之上的,就是資料庫的例項,也就是通常create databases獲得的東西。也就是說一個schema 例項 可以有多個schema, 可以給不同的使用者建立不同的schema,並且他們都是在同一資料庫例項下面。
在MySQL中基本認為schema和資料庫相同,也就是說schema的名稱和資料庫的例項的名稱相同,一個數據庫有一個schema。
而在PostgreSQL中,可以建立一個數據庫,然後在資料庫中,建立不同的schema,每個schema又有著一些各自的表,索引等。
如下圖: