当前位置:Linux教程 - Mysql - PostgreSQL 6 综述

PostgreSQL 6 综述

高级观点
对于那些不知道的人来说,PostgreSQL是一个关系数据库并类似于其他数据库,它被用来快速存储信息、 正确的检索。数据库提供组织数据存储、创建和检索的能力。一些数据库提供比其他数据库更多的灵活性,随着被存储数据的规模和重要性不断增加,这些问题变得很重要。

这篇文章是为一个至少得益于一个或多个数据库产品并且想要知道在他/她当前选择的数据库中错过了什么功能的人而写的。

小历史……
在开放源代码在媒体火爆前很长时间,回到Unix-on-PC的先驱还是Minix 时代,开始了一个工程以便试验关系数据库的可行性。随着在Unix上的数据库的市场不断壮大,PostgreSQL (随后称为Postgres和以后的 Postgres 95 )默默地缓慢向前,在它感兴趣的领域为其核心用户- 研究生扩展功能集合。这在市场上危害了Postgres (如果“市场”这样一个术语可被用于自由产品),在那里有更世俗的功能的其他数据库产品占据了中心。

随着最近Linux 和开放源代码的流行热浪,Postgres吸引了大量对更多主流功能的渴望的新开发者和用户加入。发展步伐加快了。我想在几个月前做这个评论,但是很多Postgres支持者主张我等到6.5版发行之后。他们是正确的;它值得等。

许可证
Postgres 是开放源代码的一种形式,但并非是GPL。相反,它基于一个UC-Berkley 许可证,它依然如开放软件所得到的那样开放。

支持
技术支持通过第三方组织得到。就象大多数开放源代码工程,一般用户能通过Usenet或各种各样的聊天室得到足够的技术支持。

平台
服务者可在Linux、FreeBSD和大多数主要的Unix 变种上得到。在Windows 95/98/NT 上有客户库,服务器平台也是一样(有库户库)。

软件包
主要有3个-RPM、Debian和 .tgz 可得到。Postgres随几个Linux 分发来发布,包括红帽子。然而,我的红帽子的版本不包括最新的PostgreSQL 版本,所以我在做评论前升级到了最新的稳定版本。

安装
即使有RPM,安装也不是自动的,然而,它相比较于一个主要的商业RDBMS来说是相当简单的。数据库需要一个特殊的用户(名为postgres)初始化数据库并随后启动postgres 服务/守护进程。这个特殊用户的使用消除了让根用户运行服务的需要,这样防止一大堆安全问题。

资源使用
Postgres 守护进程(称为postmaster) 在一个i386 Linux机器大约消耗1100K内存, 其绝大多数在共享库之中。通过比较,单个bash 外壳用户使用960K。这个很小的足迹(footprint)允许在非专用机器上随便使用Postgres。更大的数据库产品将在数据库表和索引缓冲上消耗几兆字节,但是这种选择在PosgreSQL上是没有的。

数据类型
数据库程序员不能得到足够的数据类型。保存一两个字节的机会似乎不是那么重要,但是当一张数据库表有几百万行在其中时,它们能获得显著的规模和速度差别。Postgres有一个丰富的字段数据类型选择供它的任意支配。它有标准的SQL数据类型-一个定长整数、多种浮点和定点十进制小数点数(又名DECIMAL)和定长于变长字符串。很多在功能更丰富的RDBMS中的类型也存在,包括布尔、时间间隔和autonumber(自动数)。Postgres确实在深奥的数据类型中显示出它的学术传统,这些包括多维数组类型(而非依靠子表),两维几何形状如多边形和圆,以及也许最不常见得的IP地址和CIDR的数据块。也有大对象(BLOB)支持,但是文档承认,其实现是有点慢。一开始我以为对多边形数据类型唯一的用途是作为到CAD系统(Computer Aided Draft-计算机辅助绘图)的后端,然而, 一个朋友马上建议我存储GPS数据和范围,它使我相信了这些额外的数据类型确实迟早能派上用场。

有一堆怪异的数据存储类型是一个问题,但是Postgres实际上有处理这些数据类型的SQL函数和算符,让他们感到象INT和VARCHAR一样自然是数据库的一部分,并有助于产品的整体平滑性。一个更面向商业化的产品将省掉这些,而让客户方程序员做这些工作。拥有一个非商业性的背景有一些优势。

SQL 相容性
PostgreSQL最近接受了SQL92作为其SQL语言句法的规范,并且他们相当接近了。来自一个Oracle背景的查询编写者将有回家的感觉,而且Sybase/SQL Server或Informix的用户也将不会有许多麻烦。

也支持更复杂的查询构造,例如subselect。一旦允许subselect,则实现对视图就变得容易(并且有理由希望。

安全
Postgres有标准SQL的grant/revoke命令,同时也有该模型所有的强项和不足。另外,Postgres兼顾有点 Unix文件许可相似的语法。

事务、备份和恢复
Postgres支持事务的提交(commit)和回卷(rollback)。相反,在大多数其他轻量级数据库产品上缺乏这个特征。目前不支持嵌套的事务,这不奇怪,因为许多主要的商业数据库也不支持他们。

值得注意的省略
最值得注意的一个省略是缺乏外部关键字约束。该省略在非商业性且轻量级数据库中是普遍的,DBASE/ Paradox/FoxPro等同类的商业的数据库也是一样。在获知真正指向被参照的数据库表的一个真实行的参考字段仍然有一个方便的因素,并且这种方便在PostgreSQL是没有的。对有效地通过触发器的使用强制外部键值通常是被广泛接受的惯例,我将下次讨论它。

存储过程和触发器
对Postgres有一个非常类似Oracle的存储过程语言,允许创建函数、操作符和普通的老式过程。它有Oracle PL/SQL同样多的特征并明显超过Sybase的T/SQL。

一件相当奇怪的事情是触发器独立于存储过程而存在。触发器能调用存储过程,但是不必非要这样,相反可以调用一个更简单的SQL查询。这种奇特是由在Postgres早期存储过程语言的触发器功能的事实造成的。事实上,存储过程语言只是另一种模块,复杂语句功能可以通过用其他语言(C、TCL)编写的模块提供,并且这些模块能在运行时刻被连接进数据库。这种模块化带来一些真正的动力和灵活性,在存储过程语言的费用方面似乎有点脱节,它其实以低价支付。

备份、恢复、导出和导入工具
备份和恢复工具是可以得到的,但是有点原始。有导出工具(拷贝数据库表数据到一个文本文件),但是它们在功能上缺乏。没有导入工具,然而,因为数据库表作为常规文件系统的文件被存储,他们可以经由 PSQL命令行和cat命令被导入。我仍然不会介意看见多几个字节的磁盘空间花在一个外壳脚本上避免这个细节。当给出一个pg_dump实用程序,期望一个相应的pg_load似乎是合理的。

连接性
对于调用Postgres的API有几种语言,C、C++、Perl、Python、PHP、TCL等等。有ODBC和JDBC驱动程序, 连接到Postgres基本上像你希望的那样灵活。第三方支持工具落后于MySQL,但是,在最近的几个月里,Postgres在这个领域已经打下了扎实的基础。

总结
PostgreSQL已经是不利新闻的一个牺牲品,被列为一个学术的玩物,为真实世界使用太复杂。在过去这可能是对的,然而不再是。它有一个远远超过其他进展缓慢的数据库甚至一些企业数据库的功能集,然而, 它缺乏用来衡量达到高价产品的很多管理特征和调节能力,这些特征是数据库决不会一般水平的数据库所要求的,并且甚至他们不会注意到这很少的缺点。PostgreSQL在Unix数据库竞技场成为了一个真正的竞争者。

 

PostgreSQL
花费:可免费
支持平台:大多数 Unix:服务器和客户
Windows:仅客户