fbpx
维基百科

PostgreSQL

PostgreSQL是一个開源的物件-關聯式資料庫管理系统,在類似BSD授權MIT授權的PostgreSQL授權下发行。[4]

PostgreSQL
開發者PostgreSQL Global Development Group
首次发布1996年7月8日,​26年前​(1996-07-08[1]
目前版本
  • 15.2 (2023年2月9日;穩定版本)[2]
源代码库
  • git.postgresql.org/gitweb/?p=postgresql.git
编程语言C语言
操作系统Linux, Windows, FreeBSD, OpenBSD, NetBSD, macOS, AIX, HP/UX, Solaris[3]
系統平台x86, x86_64, IA64, PowerPC, PowerPC 64, S/390, S/390x, Sparc, Sparc 64, ARM, MIPS, MIPSEL, PA-RISC[3]
语言英语
类型關聯式資料庫
许可协议PostgreSQL授權[4]
网站www.postgresql.org 

PostgreSQL這個單字的拼法讓有些人覺得很難讀,特别是那些把SQL讀作"sequel"的人。PostgreSQL開發者把它讀作"post-gress-Q-L"。(Audio sample[5],5.6k MP3)。它也經常被简稱为"postgres"。

历史

PostgreSQL经历了长时间的演变。该项目最初开始于在加利福尼亚大学伯克利分校Ingres计划。这个计划的领导者迈克尔·斯通布雷克在1982年离开加利福尼亚大学伯克利分校去推进Ingres的商业化,但最后还是返回了学术界。在1985年返回伯克利之后,斯通布雷克开始了post-Ingres计划,致力于解决在1980年代早期所出现一些数据库系统存在的问题。Postgres和Ingres的代码库开始(并保持)完全分离。

新项目Postgres的目的是通过增加最少的功能来完全支持所需要的类型。这些功能包括类型定义和完整描述数据关系的能力。完整描述数据关系的能力之前虽广为使用但却需要由用户来维护。Postgres的数据库能够"理解"关系,并可以使用一定的规则以自然方式在相关的表中检索信息。

从1986年开始,该项目组发表了一些描述这一系统基本原理的论文,并在1988年实现并运行了一个Demo版本。项目组在1989年六月向少数用户发行了版本1.0,随后在1990年6月发行了带有全新规则系统的版本2.0。1991年的版本3.0再次重写了规则系统,并增加了对多个存储管理器的支持与改进的查询引擎。Postgres在1993年开始拥有大量用户,这些用户提供了大量的功能与优化建议。但是在发行了作为细节修正的版本4.0之后,Postgres计划就终止了。

尽管Postgres计划正式的终止了,BSD许可证(Postgres遵守BSD许可证发行)却使开发者们得以获取源代码并进一步开发系统。1994年,两个加利福尼亚大学伯克利分校的研究生 Andrew Yu和Jolly Chen 增加了一个SQL语言解释器来替代早先的基于Ingres的QUEL系统,建立了Postgres95。代码随后被发布到互联网上供全世界使用。Postgres95在1996年被重命名为PostgreSQL以便突出该数据库全新的SQL查询语言

PostgreSQL首次发行即选择6.0作为其版本号,由来自世界各地的数据库开发者和志愿者们,通过互联网进行软件的维护。在2005年1月19日,PostgreSQL发行了版本8.0。自版本8.0之后,PostgreSQL得以借助原生方式运行于Windows系统之下。

尽管许可证允许PostgreSQL被用于商业用途,PostgreSQL却并没有像Ingres那样快速的被商业化。在2005年1月,PostgreSQL才收到了它来自数据库厂商的第一份援助。Pervasive Software[6]宣布了对PostgreSQL的商业支持和社区参与。

但其实在此之前,就已经有一些公司开始对PostgreSQL伸出援手。2000年,前Red Hat投資者籌組了一間名為Great Bridge的公司來商業化PostgreSQL,与其他商用資料庫廠商展开競爭。Great Bridge資助了好幾位PostgreSQL開發者,並且貢獻了許多資源給社区。然而到了2001年末,Great Bridge却終止了營運,一部分原因在于PostgreSQL在被商业化后,其市場狀況并不理想。

2001年,Command Prompt, Inc.发布了Mammoth PostgreSQL,这是最老牌的PostgreSQL商業软件。他們通过對開發者的贊助,和开发PL/Perl、PL/php等PostgreSQL在各语言中的实现,以及維護PostgreSQL Build Farm等方式來支援PostgreSQL社群。

2005年1月,PostgreSQL接到了來自另一間数据库廠商Pervasive Software的支持,该公司以常見於Novell NetWare平台的Btrieve產品而聞名。他們宣布了進行商業支援和對社群的參與。但在他們成功商业化PostgreSQL一段時間後的2006年7月,Pervasive Software離開了PostgreSQL的支援市場。

在2005年中,兩間其他的公司宣佈商業化PostgreSQL,分別進入不同的利基市場。EnterpriseDB宣布將專注於讓使用Oracle的應用程式能更容易的在PostgreSQL上運行。Greenplum則專注貢獻在資料倉儲商業智慧的應用程式,尤其以BizGres專案著稱。

2005年10月,昇陽的軟體部門執行副總裁John Loiacono談論到:"我們不會去OEM微軟的產品,我們正關注着PostgreSQL",儘管當時並沒有任何規格釋出。到了2005年11月,昇陽宣布將支援PostgreSQL。2006年6月,Solaris 10包含PostgreSQL一起發佈。

至於PostgreSQL專案本身,他繼續着每年一個主要版本發佈,以及次要的除錯版本發佈,这些发布全都遵守BSD授權。

描述

如果很粗略地观察PostgreSQL,会觉得这个数据库系统和其它数据库很类似。因为PostgreSQL使用SQL语言来执行资料的查询。这些资料通过外键联系在一起,以一系列表格的形式存在。PostgreSQL相对于竞争者的主要优势为可编程性:对于使用数据库资料的实际应用,PostgreSQL让开发与使用变得更简单。

SQL数据在“平面表格”中存储简单的数据类型,需要用户使用查询把有关的信息收集在一起。这与应用和用户利用数据自身的方式相对立:典型的使用带有丰富数据类型的高级语言,在其中所有有关的数据作为它自己的一个完整单元来操作。典型的称呼为记录对象(依据各自语言)。

转换来自SQL世界的信息到面向对象编程世界体现得很困难,因为两者有非常不同的数据组织的模型。工业界把这个问题称为对象关系不匹配英语Object-relational_impedance_mismatch:从一个模型映射到另一个要花费项目开发者40%的时间。一些映射解决方案,典型的称为对象关系映射,致力于这个问题,但是它们花费很多并有自身的问题,导致糟糕的性能或强制所有的数据访问通过映射所支持的一种语言来进行。

PostgreSQL可以直接在数据库中解决很多这类问题。PostgreSQL允许用户定义基于正规的SQL类型的新类型,允许数据库自身理解复杂数据。例如,你可以定义一个address来组合一些事物如街道编号、城市和国度的字符串。从这一点上你可以轻易地建立把保存地址所需要的所有字段包含在一个单一行列中的表。

PostgreSQL还允许类型包括继承,这是在面向对象编程中的主要概念。例如,你可以定义post_code类型,并接着基于它建立us_zip_codecanadian_postal_code。在数据库中的address就可以采用us_address或者canadian_address形式,而特定的规则可以在各自情况下验证数据。在PostgreSQL的早期版本中,实现新类型需要写C扩展并把它们编译到数据库服务器中;在版本7.4中,通过CREATE DOMAIN建立和使用定制类型变得很容易了。

数据库自身的编程可以从使用函数上获得巨大的利益。多数SQL系统允许用户写存储过程,它是其他SQL语句可以调用的一块SQL代码。但是SQL自身仍旧不适合作为编程语言,而且SQL用户在构造复杂逻辑时要经历巨大的困难。更糟糕的是,SQL自身不支持很多的编程语言中最基本的操作,比如分支循环。每个厂商都转而写它们自己对SQL语言的扩展来增加这些特征,而这种扩展不是必须跨越数据库平台操作。

在PostgreSQL中程序员可以用一组可观的支持语言中任何一种来写这种逻辑。

  • 类似于Oracle的过程语言PL/SQL的叫做PgSQL[7]的内置语言,在处理查询密集的过程时提供了独特的优势。
  • 流行脚本语言比如PerlPythonTclRuby的包装器,允许利用它们在字符串处理和连接到广阔的外部函数库的力量。
  • 需要把复杂逻辑编译到机器代码所能提供的高性能的过程可以利用CC++
  • 在更加深奥的方面,R统计语言的处理器允许数据库查询利用它的一组丰富的统计函数。

程序员可以把代码作为函数插入服务器中,它是使代码类似于存储过程的一个小包装器。以这种方式SQL代码可以调用(比如)C代码或反之。

  • 性能增进,因为数据库引擎在一个时间一个地方调用所有的逻辑,减少了在客户和服务器之间的来回往返的次数。
  • 可靠性增进,因为数据验证代码集中到一个地方,就在服务器上,而不用依赖在多个客户应用中的同步逻辑,它们甚至可能以多种编程语言写成。
  • 通过向服务器增加有用的抽象,客户代码可以变得更短小和简单。

这些优势合起来可以证实PostgreSQL从编程角度是最高级的数据库系统。使用PostgreSQL可以显著的减少很多项目的整体编程时间,这种优势随着项目复杂而增长。

特征

函数

通过函数,可以在数据库服务器端执行指令程序。尽管这样的指令程序可以使用基本的SQL语句写成,但是由于其缺乏流程控制等功能,所以在PostgreSQL中引入了使用其它程序语言编写函数的能力,包括:

  • 一个内置的名为pgSQL[8]的过程语言,类似于Oracle的PL/SQL
  • 包括PL/Perl[9],PL/PHP[10],PL/Python[11],PL/Ruby[12],PL/sh[13],PL/Tcl[14]与PL/Scheme[15]在内的脚本语言;
  • 编译语言:CC++,或Java(通过PL/Java[16])。
  • R统计语言PL/R[17]

以上部分的语言,甚至可以在触发器内执行。PostgreSQL支持行返回函数:它们的输出是一系列行类型数据的集合,可以在查询中当作表来使用。函数也可以被定义成以创建者或者调用者的身份运行。在某些场合,或者其他的数据库产品中,函数也会被称为“存储过程”,但技术上这两者并未有太大分别。

索引

在PostgreSQL中,用户可以自定义索引方法,或使用内置的B树哈希表与GiST索引。PostgreSQL的索引功能同时也具有以下功能:

  • 反向索引检索:无须额外的索引就能实现类似ORDER BY field DESC的操作。
  • 表达式索引:可以建立基于表达式值而非数值或列的索引。
  • 部分索引:仅索引表的部分,可以通过在CREATE INDEX语句口添加WHERE从句以创建更小的索引。
  • 位图索引扫描:从8.1版开始支持此功能。该功能将读取多个索引,生成表示它们之间符合查询标准的多元组交集的位图。这样解决了混合索引的问题。在一个具有20列的表中,理论上能创建20! 个索引,在实际应用中並不实用。使用位图索引扫描后,在每次查询时,它将能把约束条件中所涉及列各自的索引进行任意的排列组合。

触发器

触发器是由SQL语句查询所触发的事件。如:一个INSERT语句可能触发一个检查数据完整性的触发器。触发器通常由INSERT或UPDATE语句触发。

在PostgreSQL中,可在数据表上设置触发器,但无法在视图中设置(对视图的UPDATE或者INSERT操作可以使用规则(RULE)定义)。多个触发器可依据字母顺序依次执行。此外,除了使用内嵌的PL/PgSQL语言之外,触发器的函数也可以用PL/Perl,PL/Python等语言编写。

多版本并发控制

PostgreSQL使用多版本并发控制(MVCC,Multiversion concurrency control)系统进行并发控制,该系统向每个用户提供了一个数据库的“快照”,用户在事务内所作的每个修改,对于其他的用户都不可见,直到该事务成功提交。这从很大程度上减少了对读取锁的依赖,同时保证了数据库高效地符合ACID原则。

规则

规则(RULE)允许一个查询能被重写,通常用来实现对视图(VIEW)的操作,如插入(INSERT)、更新(UPDATE)、删除(DELETE)。

数据类型

PostgreSQL内置丰富的数据类型,包括:

  • 任意精度的数值
  • 无限制长度文本
  • 几何图元
  • IP地址IPv6地址
  • 无类域间路由地址块,MAC地址
  • 数组
  • JSON数据
  • 枚举类型
  • XML数据 (需要在PostgreSQL源码编译时指定 "--with-libxml"选项)

此外,用户可以创建自定义数据类型,通常通过PostgreSQL的GiST机制,它们也能被很好得索引,比如PostGIS地理信息系统的数据类型。

用户定义对象

用户可以为数据库内几乎所有的对象定义新的类型,包括:

  • 索引
  • 操作符(可重载现有操作符。)
  • 聚合函数
  • 数据域
  • 数据类型转换
  • 会话(编码转换)

继承

数据表的结构及属性可从一个“父”表中继承,数据将在两者间共享。对子表中数据的插入或者删除也将在父表中体现,同样,对父表作出的修改,比如添加列等操作也会导致子表产生相应的改动。该功能尚未完全实现,实际上,表的约束尚不能继承。比如,在一张外联参考了父表id字段的表中,插入一条具有子表中某条记录id数据的记录会导致失败,因为PostgreSQL在对父表的外键约束检查中不会检查子表的内容。

其他功能

  • 关系完整性约束:包括外键,列约束与行检查
  • 视图
  • 内、外(全、左、右)连接
  • 子查询
  • 事务处理
  • 支持大部分SQL:2003标准的主要特征[18]。不支持部分特征[19],和将来支持的特征[20],可至已有版本手册[21]中查询。
  • SSL加密连接
  • 二进制/文本大对象的存储
  • 在线备份
  • 数据域
  • 表分区
  • 表空间
  • 保存点
  • 时刻点恢复
  • 二阶段提交
  • TOAST(The Oversized-Attribute Storage Technique,超大属性存储技术)用以透明地将超大表属性(如大MIME附件或XML消息)压缩后存储至独立的区域
  • 正则表达式[22]

資料庫管理及開發工具

  • phpPgAdmin[23]基于php语言写的用于管理PostgreSQL数据库的程序
  • PgAdmin[24]另外一个用于管理PostgreSQL数据库的软件

扩展

  • 地理数据对象:PostGIS GPL
  • 全文检索:通过Tsearch2[25]或OpenFTS,将在8.3版本中内嵌Tsearch2。GPL
  • 多种异步主/从复制方案,包括Slony-I[26](BSD授权),Mammoth Replicator[27]
  • XML/XSLT支持contrib软件包中的XPath扩展[28]GPL

知名客户

版本

PostgreSQL - Red Hat Edition[33]是由Red Hat製作的分支版本,又稱Red Hat Database。

参考文献

  1. ^ HAPPY BIRTHDAY, POSTGRESQL!. PostgreSQL Website. [2018-09-19]. (原始内容于2018-07-30). 
  2. ^ 2.0 2.1 PostgreSQL 15.2, 14.7, 13.10, 12.14, and 11.19 Released!. 2023年2月9日 [2023年2月11日]. 
  3. ^ 3.0 3.1 The PostgreSQL Global Development Group. Supported Platforms. PostgreSQL Documentation. [2018-09-19]. (原始内容于2018-10-12). 
  4. ^ 4.0 4.1 License. [2019-10-01]. (原始内容于2019-09-05) (英语). 
  5. ^ Audio sample(页面存档备份,存于互联网档案馆
  6. ^ [1](页面存档备份,存于互联网档案馆
  7. ^ PL/PgSQL(页面存档备份,存于互联网档案馆
  8. ^ PL/pgSQL(页面存档备份,存于互联网档案馆
  9. ^ PL/Perl(页面存档备份,存于互联网档案馆
  10. ^
  11. ^ PL/Python(页面存档备份,存于互联网档案馆
  12. ^
  13. ^
  14. ^ PL/Tcl(页面存档备份,存于互联网档案馆
  15. ^
  16. ^
  17. ^
  18. ^ [2](页面存档备份,存于互联网档案馆
  19. ^ 不支持部分(页面存档备份,存于互联网档案馆
  20. ^ 未来版本的支持情况(页面存档备份,存于互联网档案馆
  21. ^ 已有版本手册(页面存档备份,存于互联网档案馆
  22. ^ [3](页面存档备份,存于互联网档案馆
  23. ^ phpPgAdmin(页面存档备份,存于互联网档案馆
  24. ^ PgAdmin(页面存档备份,存于互联网档案馆
  25. ^ Tsearch2(页面存档备份,存于互联网档案馆
  26. ^ Slony-I(页面存档备份,存于互联网档案馆
  27. ^
  28. ^
  29. ^ [4](页面存档备份,存于互联网档案馆
  30. ^ [5](页面存档备份,存于互联网档案馆
  31. ^ [6](页面存档备份,存于互联网档案馆
  32. ^ [7](页面存档备份,存于互联网档案馆
  33. ^ PostgreSQL - Red Hat Edition Project. [2010-06-24]. (原始内容于2010-05-13). 

参閱

外部链接

postgresql, 本條目存在以下問題, 請協助改善本條目或在討論頁針對議題發表看法, 此條目的语调或风格可能不適合百科全書的寫作方式, 2015年9月20日, 請根據指南協助改善这篇条目, 請在讨论页討論問題所在及加以改善, 此條目需要补充更多来源, 2015年9月20日, 请协助補充多方面可靠来源以改善这篇条目, 无法查证的内容可能會因為异议提出而被移除, 致使用者, 请搜索一下条目的标题, 来源搜索, 网页, 新闻, 书籍, 学术, 图像, 以检查网络上是否存在该主题的更多可靠来源, 判定指引, 此條目包. 本條目存在以下問題 請協助改善本條目或在討論頁針對議題發表看法 此條目的语调或风格可能不適合百科全書的寫作方式 2015年9月20日 請根據指南協助改善这篇条目 請在讨论页討論問題所在及加以改善 此條目需要补充更多来源 2015年9月20日 请协助補充多方面可靠来源以改善这篇条目 无法查证的内容可能會因為异议提出而被移除 致使用者 请搜索一下条目的标题 来源搜索 PostgreSQL 网页 新闻 书籍 学术 图像 以检查网络上是否存在该主题的更多可靠来源 判定指引 此條目包含過多僅特定讀者會感興趣的過度細節內容 2022年5月2日 請重新整理本條目以切合主題 並移除与維基百科內容方針相悖的過度細節內容 詳細信息請參見討論頁 此條目過於依赖第一手来源 2022年10月18日 请補充第二手及第三手來源 以改善这篇条目 PostgreSQL是一个開源的物件 關聯式資料庫管理系统 在類似BSD授權與MIT授權的PostgreSQL授權下发行 4 PostgreSQL開發者PostgreSQL Global Development Group首次发布1996年7月8日 26年前 1996 07 08 1 目前版本15 2 2023年2月9日 穩定版本 2 源代码库git wbr postgresql wbr org wbr gitweb wbr p postgresql wbr git编程语言C语言操作系统Linux Windows FreeBSD OpenBSD NetBSD macOS AIX HP UX Solaris 等 3 系統平台x86 x86 64 IA64 PowerPC PowerPC 64 S 390 S 390x Sparc Sparc 64 ARM MIPS MIPSEL PA RISC 等 3 语言英语类型關聯式資料庫许可协议PostgreSQL授權 4 网站www wbr postgresql wbr org PostgreSQL這個單字的拼法讓有些人覺得很難讀 特别是那些把SQL讀作 sequel 的人 PostgreSQL開發者把它讀作 post gress Q L Audio sample 5 5 6k MP3 它也經常被简稱为 postgres 目录 1 历史 2 描述 3 特征 3 1 函数 3 2 索引 3 3 触发器 3 4 多版本并发控制 3 5 规则 3 6 数据类型 3 7 用户定义对象 3 8 继承 3 9 其他功能 3 10 資料庫管理及開發工具 3 11 扩展 4 知名客户 5 版本 6 参考文献 7 参閱 8 外部链接历史 编辑PostgreSQL经历了长时间的演变 该项目最初开始于在加利福尼亚大学伯克利分校的Ingres计划 这个计划的领导者迈克尔 斯通布雷克在1982年离开加利福尼亚大学伯克利分校去推进Ingres的商业化 但最后还是返回了学术界 在1985年返回伯克利之后 斯通布雷克开始了post Ingres计划 致力于解决在1980年代早期所出现一些数据库系统存在的问题 Postgres和Ingres的代码库开始 并保持 完全分离 新项目Postgres的目的是通过增加最少的功能来完全支持所需要的类型 这些功能包括类型定义和完整描述数据关系的能力 完整描述数据关系的能力之前虽广为使用但却需要由用户来维护 Postgres的数据库能够 理解 关系 并可以使用一定的规则以自然方式在相关的表中检索信息 从1986年开始 该项目组发表了一些描述这一系统基本原理的论文 并在1988年实现并运行了一个Demo版本 项目组在1989年六月向少数用户发行了版本1 0 随后在1990年6月发行了带有全新规则系统的版本2 0 1991年的版本3 0再次重写了规则系统 并增加了对多个存储管理器的支持与改进的查询引擎 Postgres在1993年开始拥有大量用户 这些用户提供了大量的功能与优化建议 但是在发行了作为细节修正的版本4 0之后 Postgres计划就终止了 尽管Postgres计划正式的终止了 BSD许可证 Postgres遵守BSD许可证发行 却使开发者们得以获取源代码并进一步开发系统 1994年 两个加利福尼亚大学伯克利分校的研究生 Andrew Yu和Jolly Chen 增加了一个SQL语言解释器来替代早先的基于Ingres的QUEL系统 建立了Postgres95 代码随后被发布到互联网上供全世界使用 Postgres95在1996年被重命名为PostgreSQL以便突出该数据库全新的SQL查询语言 PostgreSQL首次发行即选择6 0作为其版本号 由来自世界各地的数据库开发者和志愿者们 通过互联网进行软件的维护 在2005年1月19日 PostgreSQL发行了版本8 0 自版本8 0之后 PostgreSQL得以借助原生方式运行于Windows系统之下 尽管许可证允许PostgreSQL被用于商业用途 PostgreSQL却并没有像Ingres那样快速的被商业化 在2005年1月 PostgreSQL才收到了它来自数据库厂商的第一份援助 Pervasive Software 6 宣布了对PostgreSQL的商业支持和社区参与 但其实在此之前 就已经有一些公司开始对PostgreSQL伸出援手 2000年 前Red Hat投資者籌組了一間名為Great Bridge的公司來商業化PostgreSQL 与其他商用資料庫廠商展开競爭 Great Bridge資助了好幾位PostgreSQL開發者 並且貢獻了許多資源給社区 然而到了2001年末 Great Bridge却終止了營運 一部分原因在于PostgreSQL在被商业化后 其市場狀況并不理想 2001年 Command Prompt Inc 发布了Mammoth PostgreSQL 这是最老牌的PostgreSQL商業软件 他們通过對開發者的贊助 和开发PL Perl PL php等PostgreSQL在各语言中的实现 以及維護PostgreSQL Build Farm等方式來支援PostgreSQL社群 2005年1月 PostgreSQL接到了來自另一間数据库廠商Pervasive Software的支持 该公司以常見於Novell NetWare平台的Btrieve產品而聞名 他們宣布了進行商業支援和對社群的參與 但在他們成功商业化PostgreSQL一段時間後的2006年7月 Pervasive Software離開了PostgreSQL的支援市場 在2005年中 兩間其他的公司宣佈商業化PostgreSQL 分別進入不同的利基市場 EnterpriseDB宣布將專注於讓使用Oracle的應用程式能更容易的在PostgreSQL上運行 Greenplum則專注貢獻在資料倉儲和商業智慧的應用程式 尤其以BizGres專案著稱 2005年10月 昇陽的軟體部門執行副總裁John Loiacono談論到 我們不會去OEM微軟的產品 我們正關注着PostgreSQL 儘管當時並沒有任何規格釋出 到了2005年11月 昇陽宣布將支援PostgreSQL 2006年6月 Solaris 10包含PostgreSQL一起發佈 至於PostgreSQL專案本身 他繼續着每年一個主要版本發佈 以及次要的除錯版本發佈 这些发布全都遵守BSD授權 描述 编辑如果很粗略地观察PostgreSQL 会觉得这个数据库系统和其它数据库很类似 因为PostgreSQL使用SQL语言来执行资料的查询 这些资料通过外键联系在一起 以一系列表格的形式存在 PostgreSQL相对于竞争者的主要优势为可编程性 对于使用数据库资料的实际应用 PostgreSQL让开发与使用变得更简单 SQL数据在 平面表格 中存储简单的数据类型 需要用户使用查询把有关的信息收集在一起 这与应用和用户利用数据自身的方式相对立 典型的使用带有丰富数据类型的高级语言 在其中所有有关的数据作为它自己的一个完整单元来操作 典型的称呼为记录或对象 依据各自语言 转换来自SQL世界的信息到面向对象编程世界体现得很困难 因为两者有非常不同的数据组织的模型 工业界把这个问题称为对象关系不匹配 英语 Object relational impedance mismatch 从一个模型映射到另一个要花费项目开发者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的叫做PgSQL 7 的内置语言 在处理查询密集的过程时提供了独特的优势 流行脚本语言比如Perl Python Tcl和Ruby的包装器 允许利用它们在字符串处理和连接到广阔的外部函数库的力量 需要把复杂逻辑编译到机器代码所能提供的高性能的过程可以利用C或C 在更加深奥的方面 R统计语言的处理器允许数据库查询利用它的一组丰富的统计函数 程序员可以把代码作为函数插入服务器中 它是使代码类似于存储过程的一个小包装器 以这种方式SQL代码可以调用 比如 C代码或反之 性能增进 因为数据库引擎在一个时间一个地方调用所有的逻辑 减少了在客户和服务器之间的来回往返的次数 可靠性增进 因为数据验证代码集中到一个地方 就在服务器上 而不用依赖在多个客户应用中的同步逻辑 它们甚至可能以多种编程语言写成 通过向服务器增加有用的抽象 客户代码可以变得更短小和简单 这些优势合起来可以证实PostgreSQL从编程角度是最高级的数据库系统 使用PostgreSQL可以显著的减少很多项目的整体编程时间 这种优势随着项目复杂而增长 特征 编辑函数 编辑 通过函数 可以在数据库服务器端执行指令程序 尽管这样的指令程序可以使用基本的SQL语句写成 但是由于其缺乏流程控制等功能 所以在PostgreSQL中引入了使用其它程序语言编写函数的能力 包括 一个内置的名为pgSQL 8 的过程语言 类似于Oracle的PL SQL 包括PL Perl 9 PL PHP 10 PL Python 11 PL Ruby 12 PL sh 13 PL Tcl 14 与PL Scheme 15 在内的脚本语言 编译语言 C C 或Java 通过PL Java 16 R统计语言PL R 17 以上部分的语言 甚至可以在触发器内执行 PostgreSQL支持行返回函数 它们的输出是一系列行类型数据的集合 可以在查询中当作表来使用 函数也可以被定义成以创建者或者调用者的身份运行 在某些场合 或者其他的数据库产品中 函数也会被称为 存储过程 但技术上这两者并未有太大分别 索引 编辑 在PostgreSQL中 用户可以自定义索引方法 或使用内置的B树 哈希表与GiST索引 PostgreSQL的索引功能同时也具有以下功能 反向索引检索 无须额外的索引就能实现类似ORDER BY i field i DESC的操作 表达式索引 可以建立基于表达式值而非数值或列的索引 部分索引 仅索引表的部分 可以通过在CREATE INDEX语句口添加WHERE从句以创建更小的索引 位图索引扫描 从8 1版开始支持此功能 该功能将读取多个索引 生成表示它们之间符合查询标准的多元组交集的位图 这样解决了混合索引的问题 在一个具有20列的表中 理论上能创建20 个索引 在实际应用中並不实用 使用位图索引扫描后 在每次查询时 它将能把约束条件中所涉及列各自的索引进行任意的排列组合 触发器 编辑 触发器是由SQL语句查询所触发的事件 如 一个INSERT语句可能触发一个检查数据完整性的触发器 触发器通常由INSERT或UPDATE语句触发 在PostgreSQL中 可在数据表上设置触发器 但无法在视图中设置 对视图的UPDATE或者INSERT操作可以使用规则 RULE 定义 多个触发器可依据字母顺序依次执行 此外 除了使用内嵌的PL PgSQL语言之外 触发器的函数也可以用PL Perl PL Python等语言编写 多版本并发控制 编辑 PostgreSQL使用多版本并发控制 MVCC Multiversion concurrency control 系统进行并发控制 该系统向每个用户提供了一个数据库的 快照 用户在事务内所作的每个修改 对于其他的用户都不可见 直到该事务成功提交 这从很大程度上减少了对读取锁的依赖 同时保证了数据库高效地符合ACID原则 规则 编辑 规则 RULE 允许一个查询能被重写 通常用来实现对视图 VIEW 的操作 如插入 INSERT 更新 UPDATE 删除 DELETE 数据类型 编辑 PostgreSQL内置丰富的数据类型 包括 任意精度的数值 无限制长度文本 几何图元 IP地址与IPv6地址 无类域间路由地址块 MAC地址 数组 JSON数据 枚举类型 XML数据 需要在PostgreSQL源码编译时指定 with libxml 选项 此外 用户可以创建自定义数据类型 通常通过PostgreSQL的GiST机制 它们也能被很好得索引 比如PostGIS地理信息系统的数据类型 用户定义对象 编辑 用户可以为数据库内几乎所有的对象定义新的类型 包括 索引 操作符 可重载现有操作符 聚合函数 数据域 数据类型转换 会话 编码转换 继承 编辑 数据表的结构及属性可从一个 父 表中继承 数据将在两者间共享 对子表中数据的插入或者删除也将在父表中体现 同样 对父表作出的修改 比如添加列等操作也会导致子表产生相应的改动 该功能尚未完全实现 实际上 表的约束尚不能继承 比如 在一张外联参考了父表id字段的表中 插入一条具有子表中某条记录id数据的记录会导致失败 因为PostgreSQL在对父表的外键约束检查中不会检查子表的内容 其他功能 编辑 关系完整性约束 包括外键 列约束与行检查 视图 内 外 全 左 右 连接 子查询 事务处理 支持大部分SQL 2003标准的主要特征 18 不支持部分特征 19 和将来支持的特征 20 可至已有版本手册 21 中查询 SSL加密连接 二进制 文本大对象的存储 在线备份 数据域 表分区 表空间 保存点 时刻点恢复 二阶段提交 TOAST The Oversized Attribute Storage Technique 超大属性存储技术 用以透明地将超大表属性 如大MIME附件或XML消息 压缩后存储至独立的区域 正则表达式 22 資料庫管理及開發工具 编辑 phpPgAdmin 23 基于php语言写的用于管理PostgreSQL数据库的程序 PgAdmin 24 另外一个用于管理PostgreSQL数据库的软件扩展 编辑 地理数据对象 PostGIS GPL 全文检索 通过Tsearch2 25 或OpenFTS 将在8 3版本中内嵌Tsearch2 GPL 多种异步主 从复制方案 包括Slony I 26 BSD授权 Mammoth Replicator 27 XML XSLT支持contrib软件包中的XPath扩展 28 GPL知名客户 编辑 org域名库 29 The American Chemical Society Chicagocrime org 30 Skype Penny Arcade IMDB Sony Online 31 美國勞工部 Wisconsin Circuit Court Access with 6 180GB DBs replicated in real time OpenACS and LRN Evergreen 一個開放原始碼 GNU通用公共許可證 的集成圖書館系統 GNU Health 32 版本 编辑PostgreSQL Red Hat Edition 33 是由Red Hat製作的分支版本 又稱Red Hat Database 参考文献 编辑 HAPPY BIRTHDAY POSTGRESQL PostgreSQL Website 2018 09 19 原始内容存档于2018 07 30 2 0 2 1 PostgreSQL 15 2 14 7 13 10 12 14 and 11 19 Released 2023年2月9日 2023年2月11日 3 0 3 1 The PostgreSQL Global Development Group Supported Platforms PostgreSQL Documentation 2018 09 19 原始内容存档于2018 10 12 4 0 4 1 License 2019 10 01 原始内容存档于2019 09 05 英语 Audio sample 页面存档备份 存于互联网档案馆 1 页面存档备份 存于互联网档案馆 PL PgSQL 页面存档备份 存于互联网档案馆 PL pgSQL 页面存档备份 存于互联网档案馆 PL Perl 页面存档备份 存于互联网档案馆 PL PHP PL Python 页面存档备份 存于互联网档案馆 PL Ruby PL sh PL Tcl 页面存档备份 存于互联网档案馆 PL Scheme PL Java PL R 2 页面存档备份 存于互联网档案馆 不支持部分 页面存档备份 存于互联网档案馆 未来版本的支持情况 页面存档备份 存于互联网档案馆 已有版本手册 页面存档备份 存于互联网档案馆 3 页面存档备份 存于互联网档案馆 phpPgAdmin 页面存档备份 存于互联网档案馆 PgAdmin 页面存档备份 存于互联网档案馆 Tsearch2 页面存档备份 存于互联网档案馆 Slony I 页面存档备份 存于互联网档案馆 Mammoth Replicator contrib软件包中的XPath扩展 4 页面存档备份 存于互联网档案馆 5 页面存档备份 存于互联网档案馆 6 页面存档备份 存于互联网档案馆 7 页面存档备份 存于互联网档案馆 PostgreSQL Red Hat Edition Project 2010 06 24 原始内容存档于2010 05 13 参閱 编辑关系数据库管理系统 关系型数据库管理系统列表 关系型数据库管理系统对比 对象数据库管理系统 对象数据库管理系统列表 对象数据库管理系统对比外部链接 编辑PostgreSQL國際官方網站 页面存档备份 存于互联网档案馆 PostgreSQL 台灣使用者社群 页面存档备份 存于互联网档案馆 PostgreSQL 國際中文社群網誌 页面存档备份 存于互联网档案馆 PostgreSQL文档 页面存档备份 存于互联网档案馆 SourceForge上PostgreSQL的相关项目 PgFoundry PostgreSQL相关项目网站 Open Source Database Network Database Journal的PostgreSQL专栏 页面存档备份 存于互联网档案馆 PostgreSQL中文推廣教學平台 Mammoth 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title PostgreSQL amp oldid 74989532, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。