概念
????本文討論所說(shuō)的都是 PostgreSQL 數(shù)據(jù)庫(kù)的相關(guān)定義內(nèi)容,其中名詞以及翻譯如下:
數(shù)據(jù)庫(kù):database
模式:schema
表:table
表空間:tablespace
用戶(hù):use
用戶(hù)角色:role
數(shù)據(jù)庫(kù)(database)
PostgreSQL 通用的語(yǔ)法:
database.schema.table
????在 PostgreSQL 數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)(database)可以認(rèn)為是物理層面數(shù)據(jù)集合。當(dāng)使用不同的文字編碼/排序規(guī)則等管理數(shù)據(jù)對(duì)象時(shí),不同的文字編碼規(guī)則/排序規(guī)則要?jiǎng)?chuàng)建獨(dú)立的的數(shù)據(jù)庫(kù)。PostgreSQL 關(guān)于文字編碼/排序規(guī)則等行為的默認(rèn)規(guī)則是以database為單位的。當(dāng)需要對(duì)一組數(shù)據(jù)庫(kù)表(或函數(shù)等)的并發(fā)數(shù)進(jìn)行單獨(dú)控制時(shí),需要對(duì)這些表(或函數(shù)等)放入一個(gè)新建的 database 中,PostgreSQL 對(duì)最大并發(fā)訪(fǎng)問(wèn)會(huì)話(huà)進(jìn)行單獨(dú)控制的最小單元是 database。
????當(dāng)需要對(duì)一組數(shù)據(jù)庫(kù)表(或函數(shù)等數(shù)據(jù)庫(kù)對(duì)象)的訪(fǎng)問(wèn)進(jìn)行嚴(yán)格隔離時(shí)(不僅僅是通過(guò) SQL 層面的 priviledge 來(lái)控制),在 PostgreSQL 中,????對(duì)于 Access 的控制,除了 SQL 級(jí)別的權(quán)限控制之外,可以在 pg_hba.conf 配置文件中進(jìn)行會(huì)話(huà)級(jí)別的認(rèn)證控制。
會(huì)話(huà)級(jí)別的高精度訪(fǎng)問(wèn)控制可做到:
【1】會(huì)話(huà)來(lái)源(IP地址);
【2】會(huì)話(huà)所使用的數(shù)據(jù)庫(kù)用戶(hù);
【3】會(huì)話(huà)連接目標(biāo)的Database名
模式(schema)
????模式是數(shù)據(jù)庫(kù)中的一個(gè)概念,可以將其理解為一個(gè)命名空間或目錄,不同的模式下可以有相同名稱(chēng)的表、函數(shù)等對(duì)象而不會(huì)產(chǎn)生沖突。如果沒(méi)有模式的概念,那么不同用戶(hù)或者開(kāi)發(fā)者在創(chuàng)建各自數(shù)據(jù)庫(kù)對(duì)象命名時(shí)可能會(huì)發(fā)生沖突以及相互干擾等問(wèn)題,有了模式,就可以避免這些問(wèn)題。模式的好處如下:
- 允許多個(gè)用戶(hù)使用同一個(gè)數(shù)據(jù)庫(kù)且用戶(hù)之間不會(huì)互相干擾
- 把數(shù)據(jù)庫(kù)對(duì)象放在不同的模式下組織成邏輯組,使數(shù)據(jù)庫(kù)對(duì)象更加便于管理
- 第三方應(yīng)用可以放在不同的模式中,這樣就不會(huì)和其他對(duì)象的名字產(chǎn)生沖突了
????一個(gè)數(shù)據(jù)庫(kù)包含一個(gè)或者多個(gè)模式,模式中又包含了表、函數(shù)以及操作符等數(shù)據(jù)庫(kù)對(duì)象。其中的層級(jí)關(guān)系是:數(shù)據(jù)庫(kù)-模式-對(duì)象。需要注意的是,雖然能創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)實(shí)例,但不能同時(shí)訪(fǎng)問(wèn)不同數(shù)據(jù)庫(kù)中的對(duì)象,當(dāng)需要訪(fǎng)問(wèn)另一個(gè)數(shù)據(jù)庫(kù)中的表或其他對(duì)象時(shí),需要重新連接到這個(gè)數(shù)據(jù)庫(kù),而模式卻沒(méi)有此限制,一個(gè)用戶(hù)在連接到一個(gè)數(shù)據(jù)庫(kù)后,就可以同時(shí)訪(fǎng)問(wèn)這個(gè)數(shù)據(jù)庫(kù)中多個(gè)模式的對(duì)象。
表空間(tablespace)
????不同的數(shù)據(jù)庫(kù)表空間有不同的定義。在 PostgreSQL 中,表空間允許在文件系統(tǒng)中定義數(shù)據(jù)庫(kù)對(duì)象存儲(chǔ)的位置,實(shí)質(zhì)上就是指定一個(gè)目錄。
應(yīng)用場(chǎng)景:
- 存儲(chǔ)磁盤(pán)沒(méi)有空間時(shí),可以使用表空間把數(shù)據(jù)存在其它地方;
- 利用表空間對(duì)數(shù)據(jù)庫(kù)進(jìn)行性能優(yōu)化。常用來(lái)將頻繁使用的數(shù)據(jù)表或者索引放在高性能的硬盤(pán)上,而較少使用的放在普通硬盤(pán)上。
自帶表空間:
-
pg_default
:用來(lái)存儲(chǔ)系統(tǒng)目錄對(duì)象,用戶(hù)表、用戶(hù)表index、臨時(shí)表、臨時(shí)表index、內(nèi)部臨時(shí)表的默認(rèn)空間。 -
pg_global
:用來(lái)存儲(chǔ)系統(tǒng)字典表。
pg_tblspc 存儲(chǔ)手動(dòng)創(chuàng)建表空間的軟連接信息。初始是空的,當(dāng)手動(dòng)增加表空間時(shí),該目錄下會(huì)自動(dòng)生成一個(gè)軟連接,指向表空間設(shè)定的路徑。
????一個(gè)表空間可以讓多個(gè)數(shù)據(jù)庫(kù)使用,而一個(gè)數(shù)據(jù)庫(kù)可以使用多個(gè)表空間,屬于“多對(duì)多”的關(guān)系。注意:Oracle 中一個(gè)表空間只屬于一個(gè)數(shù)據(jù)庫(kù),而一個(gè)數(shù)據(jù)庫(kù)可以使用多個(gè)表空間,屬于“一對(duì)多”的關(guān)系。
用戶(hù)(user)和 角色(role)
????在 PostgreSQL中,存在兩個(gè)容易混淆的概念:角色/用戶(hù)。之所以說(shuō)這兩個(gè)概念容易混淆,是因?yàn)閷?duì)于PostgreSQL來(lái)說(shuō),這是完全相同的兩個(gè)對(duì)象。唯一的區(qū)別是在創(chuàng)建的時(shí)候:
-
我用下面的psql創(chuàng)建了角色kanon:
CREATE ROLE kanon PASSWORD ‘kanon’;
接著我使用新創(chuàng)建的角色kanon登錄,PostgreSQL給出拒絕信息:
FATAL: role ‘kanon’ is not permitted to log in.
說(shuō)明該角色沒(méi)有登錄權(quán)限,系統(tǒng)拒絕其登錄。 -
我又使用下面的psql創(chuàng)建了用戶(hù)kanon2:
CREATE USER kanon PASSWORD ‘kanon2’;
接著我使用kanon2登錄,登錄成功。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-512252.html
????難道這兩者有區(qū)別嗎?查看文檔,又這么一段說(shuō)明:“CREATE USER is the same as CREATE ROLE except that it implies LOGIN.”----CREATE USER 除了默認(rèn)具有 LOGIN 權(quán)限之外,其他與 CREATE ROLE 是完全相同的。
????為了驗(yàn)證這句話(huà),修改 kanon 的權(quán)限,增加 LOGIN 權(quán)限:ALTER ROLE kanon LOGIN;再次用kanon登錄,成功!
那么,事情就明了了:CREATE ROLE kanon PASSWORD ‘kanon’ LOGIN 等同于 CREATE USER kanon PASSWORD ‘kanon’.
這就是 ROLE/USER 的區(qū)別。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-512252.html
到了這里,關(guān)于PostgreSQL學(xué)習(xí)筆記(一):數(shù)據(jù)庫(kù)、模式、表空間、用戶(hù)、用戶(hù)角色的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!