PostgreSQL中幾個對象概念及其關係

來源:互聯網
上載者:User

標籤:

本文參考:http://blog.csdn.net/kanon_lgt/article/details/5931522

                 http://blog.csdn.net/kanon_lgt/article/details/6220928


DB執行個體與schema: 模式是資料庫執行個體的邏輯分割。

資料庫是被模式(schema)來切分的,一個資料庫至少有一個模式,所有資料庫內部的對象(object)是被建立於模式的。使用者登入到系統,串連到一個資料庫後,是通過該資料庫的search_path來尋找schema的搜尋順序:

可以通過命令SHOW search_path;來查看具體搜尋順序(預設如下):

postgres=# show search_path;  search_path---------------- "$user",public

    也可以通過SET search_path TO ‘schema_name‘來修改順序。

    可以通過\d 表名 來查看錶所屬的模式:

postgres=# \d test  資料表"postgres.test"  欄位 | 型別 | 修飾詞------+---------+--------id   | integer |

官方建議是這樣的:在管理員建立一個具體資料庫後,應該為所有可以串連到該資料庫的使用者分別建立一個與使用者名稱相同的模式,然後,將search_path設定為"$user"(即預設模式為與使用者名稱相同的模式),這樣,任何當某個使用者串連上來後,會預設將尋找或者定義的對象都定位到與之同名的模式中。這是一個好的設計架構。


角色(role)與使用者(user):對於PostgreSQL來說,這是完全相同的兩個對象。

唯一的區別是在建立的時候:

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並沒有限制一張表必須屬於某個特定的資料表空間,我們之所以會這麼認為,是因為在關係遞進時,偷換了一個概念:模式是邏輯存在的,它不受資料表空間的限制。


PostgreSQL中幾個對象概念及其關係

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.