最近一直在做一个和PostgreSQL数据库相关的项目,把自己在这个过程中学习的知识记录下来。关于PostgreSQL数据库网上已经有太多的相关介绍了,为了博文的系统性还是先看一下*对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])宣布了商业支持和社区参与。
2000年,前Red Hat投资者筹组了一间名为Great Bridge的公司来商业化PostgreSQL,以和其他商用数据库厂商竞争。Great Bridge资助了好几位PostgreSQL开发者,并且贡献回馈了许多资源给社区。然而到了2001年末,Great Bridge终止了营运,因为像是Red Hat...等等公司面临了严酷的竞争,且市场状况不佳。
2001年,Command Prompt, Inc.发布了Mammoth PostgreSQL,最老牌的Postgresql商业包。他们通过对开发者的赞助和对如同PL/Perl、PL/php、维护PostgreSQL Build Farm ...等等方式来支持PostgreSQL社区。
2005年1月,PostgreSQL接到了来自另一间数据库厂商Pervasive Software的支持,他们以十分常见于Novell NetWare平台的Btrieve产品而闻名。他们宣布了进行商业支持和对社区的参与。在他们得到成功一段时间后的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世界的信息到面向对象编程世界体现得很困难,因为两者有非常不同的数据组织的模型。工业界把这个问题称为对象关系不匹配:从一个模型映射到另一个要花费项目开发者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可以显著的减少很多项目的整体编程时间,这种优势随着项目复杂而增长。
特征
函数
通过函数,可以在数据库服务器端执行指令程序。尽管这样的指令程序可以使用基本的SQL语句写成,但是由于其缺乏流程控制等功能,所以在PostgreSQL中引入了使用其它程序语言编写函数的能力,包括:
一个内置的名为PL/pgSQL的过程语言,类似于Oracle的PL/SQL;
包括PL/Perl,PL/PHP,PL/Python,PL/Ruby,PL/sh,PL/Tcl与PL/Scheme在内的脚本语言;
R统计语言(PL/R)。
以上部分的语言,甚至可以在触发器内执行。PostgreSQL支持行返回函数:它们的输出是一系列行类型数据的集合,可以在查询中当作表来使用。函数也可以被定义成以创建者或者调用者的身份运行。在某些场合,或者其他的数据库产品中,函数也会被称为“存储过程”,但技术上这两者并未有太大分别。
索引
在PostgreSQL中,用户可以自定义索引方法,或使用内置的B-tree,哈希表与GiST索引。PosrgreSQL的索引功能同时也具有以下功能:
反向索引检索:无须额外的索引就能实现类似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)允许一个查询能被重写,通常被用作实现可更新的视图。
数据类型
PostgreSQL内置丰富的数据类型,包括:
任意精度的数值
无限制长度文本
几何图元
数组
此外,用户可以创建自定义数据类型,通常通过PostgreSQL的GiST机制,它们也能被很好得索引,比如PostGIS地理信息系统的数据类型。
用户定义对象
用户可以为数据库内几乎所有的对象定义新的类型,包括:
索引
操作符(可重载现有操作符。)
数据类型转换
会话(编码转换)
继承
数据表的结构及属性可从一个“父”表中继承,数据将在两者间共享。对子表中数据的插入或者删除也将在父表中体现,同样,对父表作出的修改,比如添加列等操作也会导致子表产生相应的改动。该功能尚未完全实现,实际上,表的约束尚不能继承。比如,在一张外联参考了父表id字段的表中,插入一条具有子表中某条记录id数据的记录会导致失败,因为PostgreSQL在对父表的外键约束检查中不会检查子表的内容。
其他功能
视图:暂时没有实现可更新视图,但可使用规则系统实现相同功能
Full, inner, outer(left/right)联合查询
支持大部分SQL:2003标准的主要特征[2] 以及不支持部分未来版本的支持情况,可至已有版本手册中查询。
SSL加密连接
二进制/文本大对象的存储
在线备份
TOAST(The Oversized-Attribute Storage Technique,超大属性存储技术)用以透明地将超大表属性(如大MIME附件或XML消息)压缩后存储至独立的区域
数据库管理及开发工具
Navicat导航猫for PostgreSQL是一套专为PostgreSQL设计的强大数据库管理及开发工具。它可以用于任何版本的PostgreSQL数据库,并支持大部份PostgreSQL的功能,包括触发器、索引、查看等。
phpPgAdmin基于php语言写的用于管理PostgreSQL数据库的程序
PgAdmin另外一个用于管理PostgreSQL数据库的软件
扩展
地理数据对象:PostGIS GPL
全文检索:通过Tsearch2或OpenFTS,将在8.3版本中内嵌Tsearch2。GPL
多种异步主/从复制方案,包括Slony-I(BSD授权),Mammoth Replicator
XML/XSLT支持contrib软件包中的XPath扩展GPL
著名的用户
Chicagocrime.org [5]
Wisconsin Circuit Court Access with 6 * 180GB DBs replicated in real time
Evergreen-一个开放源代码(GNU通用公共许可证)的集成图书馆系统
版本
PostgreSQL - Red Hat Edition[1]是由Red Hat制作之分支版本,又称Red Hat Database。
参见
注释
^ PostgreSQL - Red Hat Edition Project
外部链接
概念 |
|
数据库组件 |
SQL |
数据库管理系统的实现 |
|
实现类型 |
|
Postgres数据库基本介绍的更多相关文章
-
ubuntu crontab 定时备份postgres数据库并上传ftp服务器
最近公司要求备份数据库,所以就查了比较作的资料.废话不多说,入正题. 目的:定期备份ubuntu下的postgres数据库,打包上传到指定ftp服务器. 经过查找资料,解决方法: ①编写备份数据库.打 ...
-
[Kong 与 Konga与postgres数据库] 之 Kuberneres 部署
1.Kong的概述 Kong是一个clould-native.快速的.可扩展的.分布式的微服务抽象层(也称为API网关.API中间件或在某些情况下称为服务网格)框架.Kong作为开源项目在2015年推 ...
-
[Kong 与 Konga 与 Postgres数据库] 之 Kuberneres 部署
1.Kong的概述 Kong是一个clould-native.快速的.可扩展的.分布式的微服务抽象层(也称为API网关.API中间件或在某些情况下称为服务网格)框架.Kong作为开源项目在2015年推 ...
-
MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...
-
[转]MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...
-
pgadmin(IDE)工具连接postgres数据库
1. 下载软件 软件地址:http://www.pgadmin.org/download/pgagent.php 2.安装软件 安装过程:略 打开软件64位会出现 “无 ...
-
postgres数据库中的数据转换
postgres8.3以后,字段数据之间的默认转换取消了.如果需要进行数据变换的话,在postgres数据库中,我们可以用"::"来进行字段数据的类型转换.实际上"::& ...
-
Android SQLite 数据库详细介绍
Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...
-
iOS-SQLite数据库使用介绍
iOS-SQLite数据库使用介绍 SQLite是MySQL的简化版,更多的运用与移动设备或小型设备上.SQLite的优点是具有可移植性,它不需要服务器就能运行,同时,它也存在一些缺陷,首先,没有提供 ...
随机推荐
-
tensor flow入门笔记
个人学习笔记,欢迎交流.
-
USACO 3.4 Electric Fence 皮克定理
题意:在方格纸上画出一个三角形,求三角形里面包含的格点的数目 因为其中一条边就是X轴,一开始想的是算出两条边对应的数学函数,然后枚举x坐标值求解.但其实不用那么麻烦. 皮克定理:给定顶点坐标均是整点( ...
-
express 学习笔记
首先把这个库加载下来 npm install -g express 这样会安装它所有依赖包,这个非常恐怖.这个框架要依赖这么多外来的东西,如果有一个不与时俱进就会拖累整个框架的质量. C:\windo ...
-
BBOSS框架使用jquery方式传參到后台的时候,要注意的事项
BBOSS框架.从前台传到后台的时候,參数要以这样的方式: public String initAddOrModExtendUser(HttpServletRequest request, ...
-
调色板QPalette类用法详解(附实例、源码)
http://blog.csdn.net/rl529014/article/details/51589096
-
微信小程序开发之大坑记之post请求
原文:http://blog.csdn.net/walkingmanc/article/details/54237961 在微信小程序开发过程中,如果你完全按照官方文档来,那么恭喜你,90%的可能性你 ...
-
基于visual Studio2013解决C语言竞赛题之1017次数
题目 解决代码及点评 /* 功能:有人说在400, 401, 402, ...499这些数中4这个数字共出现112次,请编程序判定这 种说法是否正确.若正确请打印出'YE ...
-
ruby中的模块
什么是模块 模块(module)是Ruby特有的功能之一.类用来表现具有数据与行为(程序)的"东西", 而模块大致来说,则是只有程序部分的集合体.类与模块最大的不同在于: 1.模块 ...
-
ActiveMQ使用的设计模式
注:接收不需要连接池,而发送需要连接池,是因为,接收在启动项目时就要注册监听,数目是固定的,而发送则会随着时间数目不断在变动,需要连接池,性能更优. 重点代码: private static void ...
-
DOM获取元素的方法
DOM:document object module 文档对象模型 DOM就是描述整个html页面中节点关系的图谱,如下图. 1,通过ID,获取页面中元素的方法:(上下文必须是document) do ...