Postgresql
Postgresql 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和对专有系统比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server的一种选择。
Postgresql 不寻常的名字导致一些读者停下来尝试拼读它,特别是那些把SQL拼读为"sequel"的人。Postgresql 开发者把它拼读为 "post-gress-Q-L"。(Audio sample,5.6k MP3)。它也经常被简略念为 "postgres"。
历史
Postgresql 经历了长时间的演变,开始于在 UC Berkeley 的 Ingres 计划。这个计划的领导者 Michael Stonebraker 在1982年离开 Berkeley 去商业化 Ingres,但是最后还是返回了学术界。在1985年返回 Berkeley 之后,Stonebraker 开始了 post-Ingres 计划来致力于在 1980 年代早期变得日益清楚的、当代数据库系统的问题。Postgres 和 Ingres 的代码库开始(并保持)完全分离了。
结果的计划叫 Postgres,目标是介入增加对类型的完全支持所需要的最小数目的特征。这些特征包括定义类型的能力,还有完全描述至今广泛使用但由用户完全维护着的联系的能力。在 Postgres 中数据库"理解"联系,并可以使用规则以自然的方式在有关的表中检索信息。
从1986年开始项目组发表了一些描述系统基本原理的论文,并在1988年这项计划建成并运行了一个原型版本。项目组在1989年六月向少数用户发行了版本 1,随后在1990年六月发行了带有重写后的规则系统的版本 2。1991年的版本 3 再次重写了规则系统,并增加了对多个存储管理器和改进的查询引擎的支持。在1993年就有大量的用户存在了,并开始用对支持和特征的要求淹没这个计划。在发行了主要作为最后清理的版本 4 之后计划就终止了。
尽管 Postgres 计划正式的终止了,BSD 许可证 (Berkeley 在其下发行的 Postgres) 确使开放源代码开发者获得复本并进一步开发系统。在1994年两个 UC Berkeley 大学的研究生,Andrew Yu 和 Jolly Chen,增加了一个 SQL 语言解释器来替代早先的基于 Ingres 的 QUEL 系统,建立了 Postgres95。代码随后被发行到 web 上来在世界上找寻它自己的出路。在1996年计划被重命名了: 为了反映数据库的新 sql 查询语言,Postgres95 变成了 Postgresql。
第一次 Postgresql 发行形成了版本 6.0。随后来自世界各地的一组数据库开发者和志愿者,通过 Internet 协作起来,维护着这套软件。自从版本 6.0 之后,出现了很多后续发行,在系统中也出现了很多改进;在 2005年1月19日,版本 8.0 成为当前发行。由8.0后,Postgresql以原生(Native)的方式,执行于Windows视窗系统。
尽管许可证允许 Postgres 的商业化,Postgres 代码没有像 Ingres 那样快速的被商业开发-- 考虑到 Postgres 提供的好处这有些令人惊奇。主要分支起源于 Paula Hawthorn (从 Ingres 转移来的最初的 Ingres 项目组成员)和 Michael Stonebraker 组建 Illustra 信息技术公司来商业化 Postgres 的时候。
在 2005 年一月,Postgresql 收到了它来自数据库厂商的第一份援助。Pervasive Software ([1]) 宣布了商业支持和社区参与。
描述
对 Postgresql如果很草率地观察,您可能会觉得这个数据库系统,和其它数据库很类似。因为Postgresql 使用 sql 语言来在执行资料的查询。这些资料通过连外键联系在一起,以的一系列表格的形式存在。 Postgresql 相对于竞争者的主要优势,主要的特征为可编程性: 对于使用数据库资料的实际应用,Postgresql 让开发与使用的工作,变得更加容易。
sql 数据在"平面表格"中存储简单的数据类型,需要用户使用查询把有关的信息收集在一起。这与应用和用户利用数据自身的方式相对立: 典型的使用带有丰富数据类型的高级语言,在其中所有有关的数据作为它自己的一个完整单元来操作。典型的称呼为记录或对象(依据各自语言)。
转换来自 sql 世界的信息到面向对象编程世界体现得很困难,因为两者有非常不同的数据组织的模型。工业界把这个问题称为阻抗不匹配: 从一个模型映射到另一个要花费项目开发者 40% 的时间。一些映射解决方案,典型的称为对象-关系映射,致力于这个问题,但是它们花费很多并有自身的问题,导致糟糕的性能或强制所有的数据访问通过映射所支持的一种语言来进行。
Postgresql 可以直接在数据库中解决很多这种问题。Postgresql 允许用户定义基于正规的 sql 类型的新类型,允许数据库自身理解复杂数据。例如,你可以定义一个address
来组合一些事物如街道编号、城市和国度的字符串。从这一点上你可以轻易的建立把保存地址的所需要的所有字段包含在一个单一行列中的表。
Postgresql 还允许类型包括继承,这是在面向对象编程中的主要概念。例如,你可以定义 post_code
类型,并接着基于它建立 us_zip_code
和 canadian_postal_code
。在数据库中的 address 就可以采用 us_address
或者 canadian_address
形式,而特定的规则可以在各自情况下验证数据。在 Postgresql 的早期版本中,实现新类型需要写 C 扩展并把它们编译到数据库服务器中;在版本 7.4 中,通过 CREATE DOMAIN
建立和使用定制类型变得很容易了。
数据库自身的编程可以从使用函数上获得巨大的利益。多数 sql 系统允许用户写存储过程,它是其他 sql 语句可以调用的一块 sql 代码。但是 sql 自身仍旧不适合作为编程语言,而且 sql 用户在构造复杂逻辑时要经历巨大的困难。更糟糕的是,sql 自身不支持很多的编程语言中最基本的操作,比如分支和循环。每个厂商都转而写它们自己对 sql 语言的扩展来增加这些特征,而这种扩展不是必须跨越数据库平台操作。
在 Postgresql 中程序员可以用一组可观的支持语言中任何一种来写这种逻辑。
- 类似于 Oracle 的过程语言 PL/SQL 的叫做 PL/PgSQL 的内置语言,在处理查询密集的过程时提供了独特的优势。
- 流行脚本语言比如Perl,Python,Tcl,和 Ruby 的包装器,允许利用它们在字符串处理和连接到广阔的外部函数库的力量。
- 需要把复杂逻辑编译到机器代码所能提供的高性能的过程可以利用C 或 C++。
- 在更加深奥的方面,R 统计语言的处理器允许数据库查询利用它的一组丰富的统计函数。
程序员可以把代码作为函数插入服务器中,它是使代码类似于存储过程的一个小包装器。以这种方式 sql 代码可以调用(比如) C 代码或反之。
- 性能增进,因为数据库引擎在一个时间一个地方调用所有的逻辑,减少了在客户和服务器之间的来回往返的次数。
- 可靠性增进,因为数据验证代码集中到一个地方,就在服务器上,而不用依赖在多个客户应用中的同步逻辑,它们甚至可能以多种编程语言写成。
- 通过向服务器增加有用的抽象,客户代码可以变得更短小和简单。
这些优势合起来可以证实 Postgresql 从编程角度是最高级的数据库系统。使用 Postgresql 可以显著的减少很多项目的整体编程时间,这种优势随着项目复杂而增长。
特征
Postgresql 的某些在其他关系数据库中很少见的特征包括:
- 用户定义类型
- 用户定义操作符
- 能获得多个存储过程语言,包括C,PL/Perl,PL/python,PL/PHP,PL/Java,PL/sh,PL/Tcl,PL/R,PL/Ruby,和固有的 PL/PgSQL
- 支持 IP 地址 (包括 IPv6),CIDR 块,和 MAC 地址数据类型
- 表继承(但未完全实现)
- 规则 - 实现允许应用开发者修改到来查询的"查询树"的服务器端逻辑
- 并发,通过多版本并发控制(MVCC)设计来管理,它即使在繁重的并发访问下也能确保优异的性能
- 表达式索引 - 在表达式的值之上建立索引,而不只在单一的列或一组列之上
- 部分索引 - 在表的一部分上建立索引。如果只有表的一部分实际上需要索引,就能节约磁盘空间并增进性能