PostgreSQL的邏輯儲存結構主要是指資料庫中的各種資料庫物件,包括:資料庫叢集、資料庫、表、索引、檢視等等。所有資料庫物件都有各自的物件識別符號oid(object identifiers),它是一個無符號的四位元組整數,相關物件的oid都存放在相關的系統目錄表中,比如資料庫的oid和表的oid分別存放在pg_database,pg_class表中。下圖展示了PostgreSQL資料庫的邏輯儲存結構。
下面重點介紹一下PostgreSQL中的資料庫。影片講解如下:
https://www.bilibili.com/video/BV1RfpRehEbA/?aid=112976749200...
在PostgreSQL中,一個資料庫是資料庫物件的集合。通常每個資料庫物件屬於並且只屬於一個資料庫。更準確地說,一個資料庫是一個模式的集合,而模式包含表、函式等等各種資料庫物件。因此資料庫的完整層次應該包含如下組成部分:資料庫伺服器、資料庫、模式、表或者某些其他物件型別,如儲存過程、儲存函式等等。當連線到資料庫伺服器時,客戶端必須在它的連線請求中指定它要連線的資料庫名,透過資料庫例項來運算元據庫中的物件。使用者可能是在同一個資料庫裡,但可能在不同的模式中。
執行下面的語句可以檢視當前PostgreSQL資料庫叢集中已有的資料庫資訊。
postgres=# \l
List of databases
Name | Owner | Encoding |......
-----------+----------+----------+-------
postgres | postgres | UTF8 |......
template0 | postgres | UTF8 |......
template1 | postgres | UTF8 |......
(3 rows)
下面詳細解釋一下每個資料庫的作用。
- postgres資料庫由initdb命令在初始化資料儲存區域時建立的。該資料庫也是客戶端預設連線的資料庫。
- template0是標準系統資料庫,該資料庫中只包含PostgreSQL版本預定義的標準物件。在資料庫叢集被初始化之後,不應該對template0做任何修改。在建立資料庫時透過指示使用template0取代template1進行複製,可以建立一個“純淨的”使用者資料庫。
- template1是第二標準系統資料庫。當在PostgreSQL中建立一個新資料庫時,實際上就是克隆了template1。這就意味著對template1所做的任何修改都會體現在所有後續建立的使用者資料庫中。因此應避免在template1中建立物件,除非想把這些物件傳播到每一個新建立的資料庫中。
查詢現有資料庫集合資訊也可以透過查詢系統表pg_database得到。
postgres=# select datname from pg_database;
# 輸出的資訊如下:
datname
-----------
postgres
template1
template0
(3 rows)