概述
在本章的剩余部分,我们将讨论你如何通过增加下面几种对象来扩展 PostgreSQL SQL 查询语言:
*
函数
*
数据类型
*
操作符
*
聚集
8.1. 扩展性是如何实现的
PostgreSQL 是可扩展的是因为它的操作是表驱动的. 如果你熟悉标准的关系系统,你知道它们把与数据库,表,字段 等信息存储在一个被称为系统表的地方.(有些系统称这些为数据字典). 这些表在用户面前表现为表,和其他表一样,只不过 DBMS 把它自己内部的信息存放在此. PostgreSQL 和标准的关系型数据库的系统表有一个关键区别是 PostgreSQL 在它的系统表里面存储了更多的信息 -- 不仅是关于表和列/字段的信息,而且还有关于它们的类型, 函数,访问方式等的信息.这些表可以被用户修改,而且由于 PostgreSQL 的内部操作是以这些表为基础的,这就意味着 PostgreSQL 可以被用户所扩展. 相比之下,传统的数据库系统只能通过修改 DBMS 内部的硬代码或装载由 DBMS 供应商提供的特殊的模块来扩展.
PostgreSQL 还与大多数其他数据库管理器不同的是 它还可以通过动态装载的方法与用户书写的代码偶合在一起. 也就是说,用户可以把一个目标代码文件 (例如,一个共享库) 声明为一个新类型或函数的实现, 这时 PostgreSQL 将根据需要装载它们. 用 SQL 写的代码甚至更容易加入到服务器中去.这种可以 "动态地"更改其操作的能力使 PostgreSQL 特别适合于新应用和新存储结构的快速定型.
8.2. PostgreSQL 类型系统
PostgreSQL 的类型系统可以有好几种方法分解开来. 类型可以分为基本类型和复合类型. 基本类型是那些用象 C 这样的语言实现的,比如 int4。 这些数据类型通常与那些常被认为是"抽象数据类型"的类型对应; PostgreSQL 对这些数据类型只能通过用户提供的方法来操作, 并且对这些数据类型的特性的理解只限于用户所描述的范围. 复合类型是当用户创建表时创建的.
PostgreSQL 对这些类型的存储方法只有一种(在存储表的所有记录的文件里), 但是用户可以从查询语言中"深入观察"这些属性, 而且可以通过在字段上定义索引(这类)方法来优化对这些类型的检索. PostgreSQL 的基础类型可以进一步分为内建类型和用户定义类型. 内建类型(象 int4)是那些编译进入系统里面去的类型. 用户定义类型是那些由用户用稍后提到的方法创建的类型.
8.3. 关于 PostgreSQL 系统表
在介绍了扩展性的基本概念后,我们现在看看系统表实际上是个什么布局. 你目前可以忽略这章,但是如果 没有这一章的信息,后面的一些章节的内容会变得很难懂, 所以你最好把这一章打上标记,以备查询.所有 系统表都具有以 pg_开头的名称. 下面的表格包含可能对最终用户有用的信息. (还有许多其他系统表,但 是很难得有机会直接对它们进行查询.)
Table 8-1. PostgreSQL 系统表
表名称描述
pg_database数据库
pg_class表
pg_attribute表字段
pg_index索引
pg_proc函数/过程
pg_type数据类型(包括基本类型和复合类型)
pg_operator操作符
pg_aggregate聚集函数
pg_am访问方法
pg_amop访问方法操作符
pg_amproc访问方法支持函数
pg_opclass访问方法操作符表
Figure 8-1. 主要的 PostgreSQL 系统表
开发人员手册给出了关于这些表和它们的字段的更多的详细信息. 不过, Figure 8-1 显示了系统表的主要成员和它们的字段. (与其他表无关的字段在这里没有显示出来,除非它们是主键的一部分.) 这个表看起来或多或少有些难懂, 除非你真正看了这些表的内容而且看了它们之间是如何相关的.从现在开始, 我们要从这个图里面挖出下面这些东西:
*
在后面的几章里,我们将提供一些在系统表上的连接 查询--这些查询展示了我们在扩展系统时所需 要的信息.仔细研究这张图会让我们对这些连接查询 (通常是三或四路连接)更容易理解,因为这样 你就能看到在查询里用到的字段是其他表的外部键字.
*
许多不同的特性(表,属性,函数,类型,访问模式等.) 是按照这个结构紧密集成在一起的.因而 一个简单的 create 命令就有可能更改许多这些表.
*
类型和过程是这个图表的核心.
注意: 我们在这里多多少少把过程 函数混起来用.
几乎每个表都包含其他一个或多个表的字段的引用.例如, PostgreSQL经常使用类型签名(例如,函数 或操作符的)来标识其他表的唯一记录.
*
有许多字段和关系有明显的含义, 但是还有许多(尤其是那些与访问模式打交道的字段)没有(明显含义).