PostgreSQL7.0手冊-程序員手冊 -37. 擴展的 SQL: 概述
2019-09-08 23:33:48
供稿:網(wǎng)友
第三十七章. 擴展 SQL:概述
內(nèi)容
擴展性是如何工作的
Postgres 類型系統(tǒng)
關于 Postgres 系統(tǒng)表
在本章的剩余部分,我們將討論你如何通過增加下面幾種對象來擴展 PostgresSQL查詢語言:
函數(shù)
類型
操作符
聚集
擴展性是如何工作的
Postgres 是可擴展的是因為它的操作是表驅動的.如果你對標準的關系系統(tǒng)熟悉,你知道它們把與數(shù)據(jù)庫,表,字段等的信息存儲在一個被稱為系統(tǒng)表的地方.(有些系統(tǒng)稱這些為數(shù)據(jù)字典).這些表在用戶面前表現(xiàn)為表,和其他表一樣,只不過 DBMS 把它自己內(nèi)部的信息存放在此.Postgres 和標準的關系型數(shù)據(jù)庫的系統(tǒng)表有一個關鍵區(qū)別是Postgres 在它的系統(tǒng)表里面存儲了更多的信息 -- 不僅是關于表和列/字段的信息,而且還有關于它們的類型,函數(shù),訪問方式等的信息.這些表可以被用戶修改,而且由于Postgres 的內(nèi)部操作是以這些表為基礎的,這就意味著 Postgres 可以被用戶所擴展.相比之下,傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)只能通過修改DBMS 內(nèi)部的硬代碼或裝載由 DBMS 供應商提供的特殊的模塊來擴展.
Postgres 與大多數(shù)其他數(shù)據(jù)庫管理器不同的是它還可以通過動態(tài)裝載的方法與用戶書寫的代碼偶合在一起.也就是說,用戶可以把一個目標代碼文件(例如,一個編譯好的 .o 文件或一個共享庫)聲明為一個新類型或函數(shù)的實現(xiàn),這時Postgres 將根據(jù)需要裝載它們.用 SQL 寫的代碼甚至更容易加入到服務器中去.這種可以"動態(tài)地"更改其操作的能力使Postgres 特別適合于新應用和新存儲結構的快速定型.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Postgres 類型系統(tǒng)
Postgres 的類型系統(tǒng)可以有好幾種方法分解開來.類型可以分為基本類型和復合類型.基本類型是那些用象C 這樣的語言實現(xiàn)的(例如 int4)。這些數(shù)據(jù)類型通常與那些常被認為是"抽象數(shù)據(jù)類型"的類型對應;Postgres 對這些數(shù)據(jù)類型只能通過用戶提供的方法來操作,并且對這些數(shù)據(jù)類型的特性的理解只限于用戶所描述的范圍.復合類型是當用戶創(chuàng)建表時創(chuàng)建的,EMP是復合類型的一個例子.
Postgres 對這些類型的存儲方法只有一種(在存儲表的所有記錄的文件里),但是用戶可以從查詢語言中"深入觀察"這些屬性,而且可以通過在字段上定義索引(這類)方法來優(yōu)化對這些類型的檢索.Postgres的基礎類型可以進一步分為內(nèi)建類型和用戶定義類型.內(nèi)建類型(象 int4)是那些編譯進入系統(tǒng)里面去的類型.用戶定義類型是那些由用戶用后面提到的方法創(chuàng)建的類型.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
關于 Postgres 系統(tǒng)表
在介紹了擴展性的基本概念后,我們現(xiàn)在看看系統(tǒng)表實際上是個什么布局.你目前可以忽略這章,但是如果沒有這一章的信息,后面的一些章節(jié)的內(nèi)容會變得很難懂,所以你最好把這一章打上標記,以備查詢.所有系統(tǒng)表都具有以 pg_ 開頭的名稱.下面的表格包含可能對最終用戶有用的信息.(還有許多其他系統(tǒng)表,但是很難得有機會直接對它們進行查詢.)
表 37-1. Postgres 系統(tǒng)表
表名稱 描述
pg_database 數(shù)據(jù)庫
pg_class 表
pg_attribute 表屬性
pg_index 從索引
pg_proc 過程 ( C 和 SQL)
pg_type 類型 (包括基本類型和復合類型)
pg_operator 操作符
pg_aggregate 聚集和聚集函數(shù)
pg_am 訪問方法
pg_amop 訪問方法操作符
pg_amproc 訪問方法支持函數(shù)
pg_opclass 訪問方法操作符表
圖 37-1. 主要的Postgres 系統(tǒng)表
參考手冊給出了關于這些表和它們的字段的更多的詳細信息.不過,主要的 Postgres 系統(tǒng)表 顯示了系統(tǒng)表的主要成員和它們的字段.(與其他表無關的字段在這里沒有顯示出來,除非它們是主鍵的一部分.)這個表看起來或多或少有些難懂,除非你真正看了這些表的內(nèi)容而且看了它們之間是如何相關的.從現(xiàn)在開始,我們要從這個圖里面挖出下面這些東西:
在后面的幾章里,我們將提供一些在系統(tǒng)表上的聯(lián)合查詢--這些查詢展示了我們在擴展系統(tǒng)時所需要的信息.仔細研究這張圖會讓我們對這些聯(lián)合查詢(通常是三或四路聯(lián)合)更容易理解,因為這樣你就能看到在查詢里用到的字段是其他表的外部鍵字.
許多不同的特性(表,屬性,函數(shù),類型,訪問模式等.)是按照這個結構緊密集成在一起的.因而一個簡單的 create 命令就有可能更改許多這些表.
類型和過程是這個圖表的核心.
注意:我們在這里多多少少把 過程 和 函數(shù) 混起來用.
幾乎每個表都包含其他一個或多個表的字段的引用.例如, Postgres 經(jīng)常使用類型簽名(例如,函數(shù)或操作符的)來標識其他表的唯一記錄.
有許多字段和關系有明顯的含義,但是還有許多(尤其是那些與訪問模式打交道的字段)沒有(明顯含義).表 pg_am,pg_amop,pg_amproc,pg_operator 和 pg_opclass 之間的關系尤其難以理解,所以我們將在討論完基本擴展后更深入地討論之(在類型接口和用于索引的操作符章節(jié)之后).
--------------------------------------------------------------------------------