本篇內(nèi)容主要講解“PostgreSQL中的模式、表、空間、用戶間的關(guān)系是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“PostgreSQL中的模式、表、空間、用戶間的關(guān)系是什么”吧!
目前創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、萬安網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
在平時的工作中,我們經(jīng)常接觸到數(shù)據(jù)庫表
和用戶
以及角色
的使用,由于經(jīng)常使用默認(rèn)的數(shù)據(jù)庫表空間
和模式
(Schema),所以我們往往忽略了數(shù)據(jù)庫表空間和模式的概念以及作用。
接下來,先介紹一下模式和表空間的定義以及作用。
一個數(shù)據(jù)庫包含一個或多個已命名的模式,模式又包含表。模式還可以包含其它對象, 包括數(shù)據(jù)類型
、函數(shù)
、操作符
等。同一個對象名可以在不同的模式里使用而不會導(dǎo)致沖突; 比如,herschema
和myschema
都可以包含一個名為mytable
的表。 和數(shù)據(jù)庫不同,模式不是嚴(yán)格分離的:只要有權(quán)限,一個用戶可以訪問他所連接的數(shù)據(jù)庫中的任意模式中的對象。
我們需要模式的原因有好多:
允許多個用戶使用一個數(shù)據(jù)庫而不會干擾其它用戶。
把數(shù)據(jù)庫對象組織成邏輯組,讓它們更便于管理。
第三方的應(yīng)用可以放在不同的模式中,這樣它們就不會和其它對象的名字沖突。
模式類似于操作系統(tǒng)層次的目錄,只不過模式不能嵌套。
表空間是實(shí)際的數(shù)據(jù)存儲的地方。一個數(shù)據(jù)庫schema
可能存在于多個表空間,相似地,一個表空間也可以為多個schema
服務(wù)。
通過使用表空間,管理員可以控制磁盤的布局。表空間的最常用的作用是優(yōu)化性能,例如,一個最常用的索引可以建立在非??斓挠脖P上,而不太常用的表可以建立在便宜的硬盤上,比如用來存儲用于進(jìn)行歸檔文件的表。
在PostgreSQL
中,存在兩個容易混淆的概念:角色/用戶。之所以說這兩個概念容易混淆,是因?yàn)閷τ赑ostgreSQL來說,這是完全相同的兩個對象。唯一的區(qū)別是在創(chuàng)建的時候:
我用下面的psql
創(chuàng)建了角色custom
:
CREATE ROLE custom PASSWORD 'custom';
接著我使用新創(chuàng)建的角色custom登錄,PostgreSQL給出拒絕信息:
FATAL:role 'custom' is not permitted to log in.
說明該角色沒有登錄權(quán)限,系統(tǒng)拒絕其登錄
我又使用下面的psql
創(chuàng)建了用戶guest
:
CREATE USER guest PASSWORD 'guest';
接著我使用guest登錄,登錄成功
難道這兩者有區(qū)別嗎?查看文檔,又這么一段說明:CREATE USER is the same as CREATE ROLE except that it implies LOGIN.----CREATE USER
除了默認(rèn)具有LOGIN
權(quán)限之外,其他與CREATE ROLE
是完全相同的。
為了驗(yàn)證這句話,修改custom
的權(quán)限,增加LOGIN
權(quán)限:
ALTER ROLE custom LOGIN;
再次用custom
登錄,成功!那么事情就明了了:
CREATE ROLE custom PASSWORD 'custom' LOGIN等同于 CREATE USER custom PASSWORD 'custom'.
這就是ROLE/USER
的區(qū)別。
模式(schema)
是對數(shù)據(jù)庫(database)邏輯分割。
在數(shù)據(jù)庫創(chuàng)建的同時,就已經(jīng)默認(rèn)為數(shù)據(jù)庫創(chuàng)建了一個模式--public
,這也是該數(shù)據(jù)庫的默認(rèn)模式。所有為此數(shù)據(jù)庫創(chuàng)建的對象(表、函數(shù)、試圖、索引、序列等)都是創(chuàng)建在這個模式中的:
創(chuàng)建一個數(shù)據(jù)庫mars
CREATE DATABASE mars;
用custom
角色登錄到mars
數(shù)據(jù)庫,查看數(shù)據(jù)庫中的所有模式:\dn
顯示結(jié)果只有public
一個模式。
創(chuàng)建一張測試表
CREATE TABLE test(id integer not null);
查看當(dāng)前數(shù)據(jù)庫的列表:\d;
顯示結(jié)果是表test屬于模式public
.也就是test
表被默認(rèn)創(chuàng)建在了public模式中。
創(chuàng)建一個新模式custom
,對應(yīng)于登錄用戶custom
:
CREATE SCHEMA custom; ALTER SCHEMA custom OWNER TO custom;
再次創(chuàng)建一張test
表,這次這張表要指明模式
CREATE TABLE custom.test (id integer not null);
查看當(dāng)前數(shù)據(jù)庫的列表: \d
顯示結(jié)果是表test
屬于模式custom
.也就是這個test
表被創(chuàng)建在了custom模式
中。
得出結(jié)論是:數(shù)據(jù)庫是被模式(schema)來切分的,一個數(shù)據(jù)庫至少有一個模式,所有數(shù)據(jù)庫內(nèi)部的對象(object)是被創(chuàng)建于模式的。用戶登錄到系統(tǒng),連接到一個數(shù)據(jù)庫后,是通過該數(shù)據(jù)庫的search_path來尋找schema的搜索順序,可以通過命令SHOW search_path
;具體的順序,也可以通過SET search_path TO 'schema_name'
來修改順序。
官方建議是這樣的:在管理員創(chuàng)建一個具體數(shù)據(jù)庫后,應(yīng)該為所有可以連接到該數(shù)據(jù)庫的用戶分別創(chuàng)建一個與用戶名相同的模式,然后,將
search_path
設(shè)置為$user
,即默認(rèn)的模式是與用戶名相同的模式。
數(shù)據(jù)庫創(chuàng)建語句:
CREATE DATABASE dbname;
默認(rèn)的數(shù)據(jù)庫所有者是當(dāng)前創(chuàng)建數(shù)據(jù)庫的角色,默認(rèn)的表空間是系統(tǒng)的默認(rèn)表空間pg_default。
為什么是這樣的呢?
因?yàn)樵?code>PostgreSQL中,數(shù)據(jù)的創(chuàng)建是通過克隆數(shù)據(jù)庫模板來實(shí)現(xiàn)的,這與SQL SERVER是同樣的機(jī)制。由于CREATE DATABASE dbname
并沒有指明數(shù)據(jù)庫模板,所以系統(tǒng)將默認(rèn)克隆template1
數(shù)據(jù)庫,得到新的數(shù)據(jù)庫dbname
。(By default, the new database will be created by cloning the standard system database template1)
template1
數(shù)據(jù)庫的默認(rèn)表空間是pg_default
,這個表空間是在數(shù)據(jù)庫初始化時創(chuàng)建的,所以所有template1
中的對象將被同步克隆到新的數(shù)據(jù)庫中。
相對完整的語法應(yīng)該是這樣的:
CREATE DATABASE dbname TEMPLATE template1 TABLESPACE tablespacename; ALTER DATABASE dbname OWNER TO custom;
連接到template1
數(shù)據(jù)庫,創(chuàng)建一個表作為標(biāo)記:
CREATE TABLE test(id integer not null);
向表中插入數(shù)據(jù)
INSERT INTO test VALUES (1);
創(chuàng)建一個表空間:
CREATE TABLESPACE tsmars OWNER custom LOCATION '/tmp/data/tsmars';
在此之前應(yīng)該確保目錄**/tmp/data/tsmars**存在,并且目錄為空。
創(chuàng)建一個數(shù)據(jù)庫,指明該數(shù)據(jù)庫的表空間是剛剛創(chuàng)建的tsmars
:
CREATE DATABASE dbmars TEMPLATE template1 OWNERE custom TABLESPACE tsmars; ALTER DATABASE dbmars OWNER TO custom;
查看系統(tǒng)中所有數(shù)據(jù)庫的信息:\l+
可以發(fā)現(xiàn),dbmars
數(shù)據(jù)庫的表空間是tsmars
,擁有者是custom
;
仔細(xì)分析后,不難得出結(jié)論:
在PostgreSQL中,表空間是一個目錄,里面存儲的是它所包含的數(shù)據(jù)庫的各種物理文件。
表空間是一個存儲區(qū)域,在一個表空間中可以存儲多個數(shù)據(jù)庫,盡管PostgreSQL不建議這么做,但我們這么做完全可行。一個數(shù)據(jù)庫并不知直接存儲表結(jié)構(gòu)等對象的,而是在數(shù)據(jù)庫中邏輯創(chuàng)建了至少一個模式,在模式中創(chuàng)建了表等對象,將不同的模式指派該不同的角色,可以實(shí)現(xiàn)權(quán)限分離,又可以通過授權(quán),實(shí)現(xiàn)模式間對象的共享,并且還有一個特點(diǎn)就是:public模式可以存儲大家都需要訪問的對象。
表空間用于定義數(shù)據(jù)庫對象在物理存儲設(shè)備上的位置,不特定于某個單獨(dú)的數(shù)據(jù)庫。數(shù)據(jù)庫是數(shù)據(jù)庫對象的物理集合,而schema
則是數(shù)據(jù)庫內(nèi)部用于組織管理數(shù)據(jù)庫對象的邏輯集合,schema名字空間之下則是各種應(yīng)用程序會接觸到的對象,比如表、索引、數(shù)據(jù)類型、函數(shù)、操作符等。
角色(用戶)則是數(shù)據(jù)庫服務(wù)器(集群)全局范圍內(nèi)的權(quán)限控制系統(tǒng),用于各種集群范圍內(nèi)所有的對象權(quán)限管理。因此角色不特定于某個單獨(dú)的數(shù)據(jù)庫,但角色如果需要登錄數(shù)據(jù)庫管理系統(tǒng)則必須連接到一個數(shù)據(jù)庫上。角色可以擁有各種數(shù)據(jù)庫對象。
到此,相信大家對“PostgreSQL中的模式、表、空間、用戶間的關(guān)系是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!