做者:柯克·罗伊巴尔 Kirk Roybal是PostgreSQL的狂热者,并按期为2ndQuadrant博客作贡献。python
前言
首先声明,我不是标题党,刻意诱惑点击或夸大描述。我打算证实,不管有没有金钱方面的考虑,经过设计和实现,PostgreSQL均可以客观,可衡量地比当前可用的数据库更好。
究竟我怎样才能证实这样一种崇高的说法是正确的呢?
继续阅读,可爱的读者。我保证不会浪费您的时间。程序员
安全透明
PostgreSQL有一个安全邮件列表。PostgreSQL项目组与其余全部人在同时学习入侵向量。没有什么是隐藏的,任何发现的东西都以使商业供应商头晕目眩的速度进行工做。供应商提供了正在审查的软件,他们所提供的的缺陷列表会更简短。
这意味着全部已知的攻击载体一旦公开就会被处理。这种安全响应能力在商业领域甚至是不可估量的。对于商业供应商来讲,在问题获得解决以前保密对补救相当重要。PostgreSQL却没有这样的限制,这是否是很棒呢!算法
多版本并发控制对您有好处
PostgreSQL选择了一种并发控制方法,该方法最适合高INSERT和SELECT工做负载。
PostgreSQL的设计很是简单,只需记住更新和删除的跟踪开销。重要的是,若是您尊重数据,则应该尝试拥抱PostgreSQL为您提供的数据安全性。
PostgreSQL中DDL也能参与事务。彻底迁移或彻底无效(最糟糕的一种无效方法是近乎立刻完成的废弃)。测试用例也能够重建。须要重置测试工具吗?答案是只需回滚事务。
PostgreSQL支持符合标准的事务隔离形式,包括序列化,已提交读和可重复读。这些方法彻底符合ACID标准。sql
PostgreSQL几乎能作全部事情
那么,您想使用NoSQL、Riak、REACT、Redis、Mongo等的功能吗?PostgreSQL都具有这种能力。不能否认,不能包括原始产品的全部细节。例如,PostgreSQL不会为您建立新的分片,那仍然是一个手动过程。但总有办法,譬如pg_partman。
您想要列数据存储吗?hstore可供选择。
您不想再培训员工吗?使用您已选择的语言继续拓展业务。
您要部分复制吗?流式逻辑复制适合您。
您要从其余系统提取数据吗?PostgreSQL具备全部数据库中最活跃的联邦对象集合-外部数据包装器(FDW),您能够用胶带和拉链将PostgreSQL挂接鳄鱼身上。能够对他像对待您本身的数据同样。
很难想到一个PostgreSQL不具有的功能,或者没有PostgreSQL扩展所能提供的功能。数据库
扩展地图功能
能够说PostGIS社区可能比PostgreSQL社区自己更大。PostgreSQL的映射功能将其放在了一个类中,即便与很是昂贵的替代品相比也是如此。
PostGIS项目之因此选择PostgreSQL做为平台,是由于其易扩展性和丰富的数据功能。这些功能能够直接公开给其余任何项目使用。任何其余供应商,不管是商业的仍是开源的,都没法回答这些问题。编程
PostgreSQL在开源领域正在引领发展
PostgreSQL项目是开源软件中最引人注目的组织之一。随着社区庞大的力量和巨大的增加,如今能够说它所存在的任何不足都会在其余供应商意想不到的时间内被解决。
几乎天天都有新的企业级功能特性发布,维护这些特性的员工是从每家公司都但愿聘用的天才中挑选出来的,只是人手远远不够。后端
PostgreSQL创建了长期稳定的解决方案
PostgreSQL在内核中内置了逻辑复制。这容许跨版本迁移。您没有被锁定到特定的硬件或软件版本。该解决方案能够无限升级。
此外,许多平台都支持PostgreSQL,包括Linux的超稳定版本。你是否须要一个比典型的3~5年投资回报率还长的解决方案?即便你历来没有升级过硬件,PostgreSQL也会永远支持你。费用很容易计算,0美圆。缓存
声明式优于命令式
数据库语言一般是声明性的。也就是说,您使用本身选择的内置语言编写了一个查询,描述了您但愿看到的结果。该数据库尝试解码您的意图,并提供适当的结果。这是全部声明式编程模型的基础。在PostgreSQL中,这能够归结为将函数映射到SQL语言中的关键字,有时还会有几个算法选择来精确地实现每一个声明。
在关于命令式与声明式编程模型的古老争论中,我以为声明式编程只是一种假装的命令式编程。数据库查询语言中的每一个声明性令牌最终都映射到一种或几种以命令式术语应用声明的算法。所以,由Henrietta定义的阻抗失配最终是由开发人员决定的。也就是说,若是开发人员的思惟方式与数据库函数程序员的思惟方式彻底一致,那么就不会出现不匹配。
那么,假设一个模型只是另外一个模型的调用特征,那么声明式模型最终将比命令模型更好吗?很高兴您这么问,由于这正是我要强调的一点。
PostgreSQL开发人员比较聪明。我不是开玩笑或忸怩做态。从字面上看,成千上万的贡献者为PostgreSQL项目作出了数以百万计的贡献,其中许可能是对其余贡献者的改进。你头脑中想到的任何状况比起已经实现的功能更好的机会是很是低的。并且,即便你的想法更好,你也应该把它们贡献给PostgreSQL项目,以造福全部人,从而提升其余人的标准。
那么,是什么让PostgreSQL那么精彩呢?无需考虑公司利益便可在全球范围内共享思想。成千上万的开发人员正在花费数十万小时来作出更好的算法选择。所以,您的软件在每一个版本中都会变得更好,一般不须要作任何特别的事情。
您说,这难道不是软件的本质吗?嗯,是的。但远不及整个世界范围的人才都参与到你的项目中来。PostgreSQL在开源社区中享有很是显著的地位。商业供应商将永远没法跟上开源项目在这个层次上所能提供的变化速度。向开源(尤为是PostgreSQL)的迁移就是证实。
商业供应商能够指出的明显优点已经所剩无几了。其中包括SMP支持、双向复制和外部工具。猜猜社区如今正在作什么,极可能这些在将来几年将得以发布。安全
任意扩展PostgreSQL
PostgreSQL有一个充满活力的编写辅助软件的技术社区。这包括插入您喜欢的任何语言,并使用它以有用的任何方式扩展PostgreSQL。您是否喜欢perl字符串处理?好的,可使用它。Python地图支持怎么样?固然,只需插入python就能够进城了。是否想使用PostgreSQL后端编写Web服务?太棒了,PostgreSQL会帮上忙。JSON?好。XML?PostgreSQL对全部这些都有直接的支持,而且提供了无限的支持。若是您认为可使用一种很好的语言,则将其插入PostgreSQL,而后将其放在服务器端便可。
您能够建立本身的函数,数据类型,运算符,集合,窗口函数或几乎其余任何东西。没有看到您喜欢的功能?从源代码拷贝并自定义它。因为许可证,您能够自由地这样作。
PostgreSQL还提供了一些钩子函数,容许您扩展数据库而没必要进行极端的编程。
这种吸取任何其余语言特性的能力是PostgreSQL所独有的。您可使用现有的任何标准库来提供任何特性。你能够遵循标准,跟上变化,能够在PostgreSQL尚在运行时对其进行更新,而且能够免费完成全部操做。服务器
大而广
PostgreSQL具备多种功能,能够充分利用已提供的硬件平台。分区,并行执行,部分索引,表空间,缓存和并行非阻塞维护例程(PostgreSQL中几乎全部东西最近都在使用CONCURRENTLY关键字)
若是这还不足以知足您的需求,那么物理流复制将以便宜的价格为您提供您所需数量的可读从节点。分片、内存缓存、队列、负载平衡和链接池均可以在PostgreSQL中使用。还不够吗?逻辑流复制怎么样?您想对世界范围的数据库进行地理分区吗?好了,欢迎使用双向复制。
并且价格仍然是0美圆。
索引丰富
PostgreSQL支持如此多的索引列表,以致于令人难以肯定如何使用它们。GiST、spi - GiST、KNN GiST、GIN、BRIN和Btree都是可用的。还有不少其余功能能够经过扩展实现,例如Bloom过滤器等。
PostgreSQL能够将它们与函数驱动的索引,部分索引,覆盖索引和全文搜索一块儿使用。这些扩展功能不是互斥的。您能够同时使用它们。
数据“推手”
已经提到的几种技术使PostgreSQL成为了出色的数据集成和分发平台。多种形式的复制与联合为几乎任何类型的数据系统提供了推、拉技术。
它们能够无限配置、组合在一块儿,以桥接数据库存储解决方案。全部这些都不须要任何ETL/ELT处理程序包。PostgreSQL就是这样作的。这个地球上最快的单一事实来源数据库是经过彻底不将数据从源系统移出来实现的。这意味着数据始终是最新的,而且能够管理响应时间。
若是您没法忍受源系统的不可靠性,或者但愿在查询端得到更好的性能,您还可使用物化视图按期缓存数据,这些视图能够在查询时进行更新。
译者注:推手是太极术语,本地引入目的是描述数据的推送和拉取。
许可证是开放的
PostgreSQL有本身的许可证,主要基于BSD许可证。这容许更大的使用和分发自由。
该许可证适用于主要项目的全部代码,主要贡献扩展,客户端库,链接管理器以及大多数相关工具。
它是高度宽容的,原文许可描述中,并不涉及可供购买。
很棒的文档
PostgreSQL项目要求任何提交代码的开发人员都要提供建议描述文档。该建议用于建立功能的说明,建议文档以多种格式提供。此文档还用于评估功能模块自己,并做为将来开发功能模块的参考。
总之,这意味着PostgreSQL依赖于文档。有不少PostgreSQL的开发人员已经学会了用C语言编码,数据库是如何工做的,以及如何管理PostgreSQL项目。这份文件是数一数二的。
测试驱动开发
PostgreSQL通过了普遍、详尽的测试。每一个错误都会经过测试来验证其存在,并编写代码来知足该测试。首先经过建立测试(和文档)来编写新功能,而后对其进行编码,直到实现该功能为止。
这些测试已集成到组建场中进行回归,所以bug不会(从新)出如今PostgreSQL的将来版本中。这意味着在每一个构建周期中,将为每一个版本的PostgreSQL运行每一个测试(当前测试)。这是大量的测试,它确保PostgreSQL仍然是可用的最稳定的数据库。
PostgreSQL仅在全部回归测试经过后才发布。这提供了“ 0个已知错误”版本。
国际化和本地化
PostgreSQL的开发人员来自世界各地。自PostgreSQL成为大学毕业生项目以来,他们就一直在使用多种本地语言工做。国际化和本地化已经成为PostgreSQL的标准作法,而PostgreSQL再也不是吸引全球商业市场的一个螺钉。
尽管PostgreSQL出于兼容性缘由将某些国际化委托给操做系统,但许多翻译都嵌入到系统中,从而提供了无缝的语言过渡体验。
云端做业
PostgreSQL在云架构中使用ansible、kubernetes和来自多个云供应商的专有工具。有几种本地云实现可供选择,以匹配您的架构。
若是您想像牛而不是宠物那样对待服务器,PostgreSQL也为您提供了云服务。
符合标准
PostgreSQL在项目的整个生命周期内一直是标准的。因为PostgreSQL起源于大学的研究生课程,所以它已被用做许多SQL标准的参考实现。
PostgreSQL实现了SQL/Med和ANSI SQL。
根据出色的文档描述,“ PostgreSQL支持SQL:2016的大部分主要功能。完整的核心一致性须要179个强制性的特性,PostgreSQL至少符合160个。这几乎超过了任何其余数据库引擎。
语言功能
PostgreSQL实现了公共表表达式(CTE)、语言控制结构(if、for、case等)、结构化错误处理,以及您指望从成熟过程语言中得到的全部好处。
您信服了吗?
我仍然能够谈论用户组、IRC频道、有解决方案的网站、博客文章和导师的奇妙社区。对于数据库是跨平台、跨体系结构和跨文化的,我能够从哲学的角度进行阐述。有无数个小时的演讲、视频和讲座。
或者,您能够直接下载它,看看它是否超出您的想象。我想您会感到很是惊喜。
更多精彩内容,请关注如下平台、网站:
中国Postgre SQL分会官方公众号(技术文章、技术活动):
开源软件联盟PostgreSQL分会
中国Postgre SQL分会技术问答社区:
www.pgfans.cn
中国Postgre SQL分会官方网站:
www.postgresqlchina.com