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