PostgreSQL基础知识( 四 )


的开源 PHP 应用程序,可以在同一套图形界面上管理 PostgreSQL、
MySQL、SQLite、SQL Server 以及 Oracle 等多种数据库 。
Adminer 有一种独特的功能让我们印象深刻:它能够以图形化方式展示
数据库中的对象,并将外键约束关系以连接线的方式展示出来 。另外,
整个 Adminer 程序的本体仅包含一个 PHP 文件,非常简洁,这可以大
大减少你安装部署时的麻烦 。
图 1-3 中,左侧是登录屏幕的截图,右侧是表间关系图形化后呈现的效
果 。很多用户会因为登录屏幕上没有填写端口号的地方而感到困惑 。如
果 PostgreSQL 使用标准的 5432 侦听端口,那么登录时不填也没问题;
【PostgreSQL基础知识】但如果不是,就需要在服务器名称后面加上端口号,注意用冒号分隔主
机名和端口号,如图 1-3 所示 。图 1-3:Adminer
对于简单的查询和修改操作来说,Adminer 的功能是足够的 。但为了支
持多种数据库,Adminer 的功能体系已经被裁剪成了各数据库均支持的
最小公共集合,因此你无法实现 PostgreSQL 所特有的一些操作,比如
创建新用户、授予权限、查询当前权限列表等 。Adminer 为了与它所支
持的各家数据库在概念上保持兼容和通用而将每个 schema 当作一个
database,这使得以图形化展示表与表之间外键关系这一功能受到了极
大影响,如果两个不同 schema 的表之间存在外键关联关系,那么在
Adminer 的界面上是无法展示出来的 。如果你是 DBA,那么建议使用
pgAdmin,当然也可以安装一套 Adminer 以备不时之需 。1.5 PostgreSQL数据库对象
假设你现在已经安装好了 PostgreSQL,请启动并连接好 pgAdmin,然后
点开左侧的目录树,此时展现在你面前的是一堆令人眼花缭乱的数据库
对象,有些你可能很熟悉,有些则可能闻所未闻 。PostgreSQL 对象类型
的数量超过了绝大多数关系型数据库(这还是在未安装任何扩展包的情
况下) 。这些对象中,有许多你可能永远都不会用到,但如果你发现业
务上需要实现一种新的对象类型,那么一般来说你要实现的东西在那一
堆眼花缭乱的对象中已经有前人实现过了,所以只需要正确选用即可 。
本书不会介绍 PostgreSQL 以标准方式安装完毕后所提供的所有对象类
型,因为 PostgreSQL 引入新特性的速度惊人,任何一本书都不可能全
面覆盖所有对象类型 。因此我们仅讨论你有必要了解的那些对象类型 。
database2
2database 一词含义宽泛,既可表示广义的数据库系统,又可以表示某些特定数据库系统中的
某一级数据存储单位,如表述不当极易给读者造成混淆 。因此本书中会区别使用,表示广义的
数据库系统时,用中文“数据库”;表示狭义的数据存储单位时,用英文“database” 。——译者

每个 PostgreSQL 服务可以包含多个独立的 database 。
schema3
3数据库业界对于 schema 有多种译法:纲要、模式、方案,等等 。但各种译法都不能准确直观
地表达出其原本的含义,即位于一个独立命名空间内的一组相关数据库对象的集合,因此前述
译法从来没有一种成为主流 。一般业界人员都直接使用英文 schema 。考虑到这个情况,为防
止初级用户理解困难,我们也按照业界习惯直接使用英文原名 。——译者注
ANSI SQL 标准中对 schema 有着明确的定义,database 的下一层逻
辑结构就是 schema 。如果把 database 比作一个国家,那么 schema 就是一些独立的州
(或者是省、府、辖区等,具体取决于各国的实际情况) 。大多数对象
是隶属于某个 schema 的,然后 schema 又隶属于某个 database 。在创建
一个新的 database 时,PostgreSQL 会自动为其创建一个名为 public 的
schema 。如果未设置
search_path
变量(后续会介绍该变量的含
义),那么 PostgreSQL 会将你创建的所有对象默认放入 public schema
中 。如果表的数量较少,这是没问题的,但如果你有几千张表,那么我
们还是建议你将它们分门别类放入不同的 schema 中 。

任何一个数据库中,表都是最核心的对象类型 。在
PostgreSQL
中,表首先属于某个 schema,而 schema 又属于某个 database,这样就
构成了一种三级存储结构 。
PostgreSQL 的表支持两种很强大的功能 。第一种是表继承,即一张
表可以有父表和子表 。这种层次化的结构可以极大地简化数据库设计,


推荐阅读