PostgreSQL基础知识( 五 )


还可以为你省掉大量的重复查询代码 。第二种是创建一张表的同时,系
统会自动为此表创建一种对应的自定义数据类型 。
视图
大多数关系型数据库都支持视图 。视图是基于表的一种抽象,通过
它可以实现一次性查询多张表,也可以实现通过复杂运算来构造出虚拟
字段 。视图一般是只读的,但 PostgreSQL 支持对视图数据进行修改,
前提是该视图基于单张实体表构建 。如果需要修改基于多张表关联而来
的视图,可以针对视图编写触发器 。9.3
版还引入了对物化视图的支
持,该机制通过对视图数据进行缓存来实现对常用查询的加速,缺点是
查到的数据可能不是最新的 。更多细节请参见 7.1.3 节 。扩展包
开发人员可以通过该机制将一组相关的函数、数据类型、数据类型
转换器、用户自定义索引、表以及属性变量等对象打包成一个功能扩展
包,该扩展包可以整体安装和删除 。扩展包在概念上与
Oracle

package 类似,从 PostgreSQL 9.1 版本之后一般推荐使用该机制来为数
据库提供功能扩展 。扩展包的具体安装步骤,请参考开发手册 。一般来
说,需要先将扩展包的二进制安装包和脚本复制到 PostgreSQL 安装目
录下,然后运行一系列脚本,再在需要其功能的 database 中单独安装该
扩展包 。注意:仅需在需要该扩展包功能的 database 中安装,不必为当
前数据库系统中的每个 database 都安装 。比如需要对某个 database 中的
数据进行高级文本搜索,那么单独在该
database
中安装
fuzzystrmatch 扩展包即可 。
安装扩展包时可以指定该包中所含有的成员对象安装到哪个
schema,若不指定则默认会安装到 public schema 中 。我们不建议采用
默认设置,因为这会导致 public schema 变得庞大复杂且难以管理,尤
其是如果你将自己的数据库对象也都存入 public schema 中,那么情况
会变得更糟糕 。我们建议你创建一个独立的 schema 用于存放所有扩展
包的对象,甚至为规模较大的扩展包单独创建一个 schema 。为避免出
现找不到新增扩展包对象的问题,请将这些新增的 schema 名称加入
search_path 变量中,这样就可以直接使用扩展包的功能而无须关注
它到底安装到了哪个 schema 中 。也有一些扩展包明确要求必须安装到
某个 schema 下(特别是过程式语言扩展包),这种情况下你就不能自
行指定了 。有很多语言扩展包,比如
plv8,就要求必须安装到
pg_catalog schema 中 。
多个扩展包之间可能存在依赖关系 。在 PostgreSQL 9.6 之前,你需
要了解这个依赖关系并把被依赖包先装好,但从 9.6 版开始,只需在安装时加上 cascade 关键字,PostgreSQL 就会自动安装当前扩展包所依
赖的扩展包 。例如:
CREATE EXTENSION postgis_tiger_geocoder CASCADE;
这条命令会先寻找并安装被依赖的 postgis 和 fuzzystrmatch 这
两个扩展包,当然,如果原本就有了,就不需要了 。
函数
用户可以编写自定义函数来对数据进行新增、修改、删除和复杂计
算等操作,可以使用 PostgreSQL 所支持的各种过程式语言来编码 。
PostgreSQL
装好以后自身就包含了数以千计的系统函数,都在默认的
postgres
库中 。函数支持返回以下数据类型:标量值(也就是单个
值)、数组、单条记录以及记录集 。其他数据库将对数据进行增删改操
作的函数称为“存储过程”,把不进行增删改的函数叫作“函数”,但
PostgreSQL 中并不区分,统一把二者称为“函数” 。
内置编程语言
函数是以过程式语言编写的 。PostgreSQL 默认支持三种内置编程语
言:SQL、PL/pgSQL 以及 C 语言 。可以通过 CREATE EXTENSION 或者
CREATE PRODCEDURAL LANGUAGE 命令来添加其他语言 。目前较常用的
语言是 PL/Python、PL/V8(即 JavaScript)以及 PL/R 。我们将在第 8 章
中展示大量的相关示例 。
运算符
运算符本质上是以简单符号形式呈现的函数别名,例如 =、&& 等 。
PostgreSQL 支持自定义运算符 。如果用户定义了自己的数据类型,那么
一般来说需要再自定义一些运算符来与之配合工作 。比如你定义了一个复数类型,那么你很有可能需要自定义 +、-、*、/ 这几个运算符来对
复数进行运算 。
外部表和外部数据封装器
外部表是一些虚拟表,通过它们可以直接在本地数据库中访问来自


推荐阅读