本文參考:http://blog.csdn.net/kanon_lgt/article/details/5931522sql
http://blog.csdn.net/kanon_lgt/article/details/6220928數據庫
DB實例與schema: 模式是數據庫實例的邏輯分割。架構
數據庫是被模式(schema)來切分的,一個數據庫至少有一個模式,全部數據庫內部的對象(object)是被建立於模式的。用戶登陸到系統,鏈接到一個數據庫後,是經過該數據庫的search_path來尋找schema的搜索順序:post
能夠經過命令SHOW search_path;來查看具體搜索順序(默認以下):spa
postgres=# show search_path; search_path ---------------- "$user",public
也能夠經過SET search_path TO 'schema_name'來修改順序。.net
能夠經過\d 表名 來查看錶所屬的模式:設計
postgres=# \d test 資料表"postgres.test" 欄位 | 型別 | 修飾詞 ------+---------+-------- id | integer |
官方建議是這樣的:在管理員建立一個具體數據庫後,應該爲全部能夠鏈接到該數據庫的用戶分別建立一個與用戶名相同的模式,而後,將search_path設置爲"$user"(即缺省模式爲與用戶名相同的模式),這樣,任何當某個用戶鏈接上來後,會默認將查找或者定義的對象都定位到與之同名的模式中。這是一個好的設計架構。
code
角色(role)與用戶(user):對於PostgreSQL來講,這是徹底相同的兩個對象。orm
惟一的區別是在建立的時候:對象
CREATE ROLE kanon PASSWORD 'kanon'; --(ROLE建立時缺省不具備LOGIN權限) CREATE USER kanon PASSWORD 'kanon2'; --(USER建立時缺省就具有了LOGIN權限)
CREATE ROLE kanon PASSWORD 'kanon' LOGIN; ---等同於 CREATE USER kanon PASSWORD 'kanon';
ROLE不具備缺省的LOGIN權限,這就是ROLE/USER的區別。
表空間與數據庫:一個表空間能夠存儲多個數據庫(雖然不建議如此,但倒是可行的)
數據庫建立語句CREATE DATABASE dbname 默認的數據庫全部者是當前建立數據庫的用戶,默認的表空間是系統的默認表空間--pg_default。
在PostgreSQL中,數據庫的建立是經過克隆數據庫模板來實現的,這與SQL SERVER是一樣的機制。CREATE DATABASE dbname並無指明數據庫模板,因此係統將默認克隆缺省的template1數據庫。而template1數據庫的默認表空間是pg_default,這個表空間是在數據庫初始化時建立的,因此全部template1中的對象將被同步克隆到新的數據庫中。
數據庫建立時相對完整的語法應該是:
CREATE DATABASE dbname OWNER kanon TEMPLATE template1 TABLESPACE tablespacename;
表空間的概念:表空間就是一個簡單的目錄,其主要用途分兩個:
1.單獨擴展表空間用,一旦磁盤或分區被耗盡,能夠建立一個表空間到其餘磁盤或分區上面。
2.區分不一樣對象的存儲位置,好比可將索引放入較快磁盤的表空間上,而將固定不變的數據放入較慢磁盤的表空間上。
與Oracle數據庫中的表空間被獨佔不一樣,PostgreSQL的表空間是能夠被共享的。當建立了一個表空間後,這個表空間能夠被多個數據庫、表、索引等數據庫對象使用。達到對象的分離與歸類的目的。
在PostgreSQL中有兩個系統自建表空間:pg_global和pg_default。
前者是系統全局表空間,存儲了關鍵的共享系統目錄。後者是系統全局表空間,存儲了關鍵的共享系統目錄。
後者是系統默認表空間,可經過set default tablespace=tablespacename來指定爲其餘表空間,在創建數據庫、表、索引等數據庫對象時,若不指定表空間參數,則系統自動將對象建立到默認表空間中。如create table tt(id int) tablespace space1.該語句等價於set default tablespace=space1;create table tt(id int);
tablespace的記錄存儲在系統數據庫postgrse的pg_tablspace表中,可使用命令/db 或者sql語句select * from pg_tablespace命令查看。
List of tablespaces Name | Owner | Location -----------+----------+----------------------------------- pg_default | postgres | pg_global | postgres | ts_licai | kanon | D:/PostgreSQL90/TableSpc/ts_licai
仔細分析後,不可貴出結論:在PostgreSQL中,表空間是一個目錄,裏面存儲的是它所包含的數據庫的各類物理文件。
總結:
表空間是一個存儲區域,在一個表空間中能夠存儲多個數據庫,儘管PostgreSQL不建議這麼作,但咱們這麼作徹底可行。
一個數據庫並不直接存儲表結構等對象的,而是在數據庫中邏輯建立了至少一個模式,在模式中建立了表等對象,將不一樣的模式指派給不一樣的角色,能夠實現權限分離,又能夠經過受權,實現模式間對象的共享,而且,還有一個特色就是:public模式能夠存儲你們都須要訪問的對象。
一個表在建立的時候能夠指定表空間,那麼,是否能夠給一個表指定它所在的數據庫表空間以外的表空間呢?答案是確定的!這麼作徹底能夠:那這不是違背了表屬於模式,而模式屬於數據庫,數據庫最終存在於指定表空間這個網的模型了嗎?!是的,看上去這確實是不合常理的,但這麼作又是有它的道理的,並且現實中,咱們每每須要這麼作:將表的數據存在一個較慢的磁盤上的表空間,而將表的索引存在於一個快速的磁盤上的表空間。
但咱們再查看錶所屬的模式仍是沒變的,它依然屬於指定的模式。因此這並不違反常理。實際上,PostgreSQL並無限制一張表必須屬於某個特定的表空間,咱們之因此會這麼認爲,是由於在關係遞進時,偷換了一個概念:模式是邏輯存在的,它不受表空間的限制。