作者:Kirk Roybal(柯克·罗伊巴尔)
来源:https://www.2ndquadrant.com/en/blog/postgresql-is-the-worlds-best-database/
译者:刘伟(llzx373),彭冲,孙雪
这个标题并非引诱或者夸张,我将会在下文中证明,PostgreSQL无论在在设计还是实现上,PostgreSQL都拥有客观且可度量的优势,无论有没有金钱方面的考虑。
接下来我将如何证明这么一个崇高的说法?读者们,请继续阅读下文,相信我,这不是浪费时间。
透明的安全机制
PostgreSQL有一个安全相关的邮件列表,在这里PostgreSQL项目组与其他参与人同时面对入侵向量。没有任何隐藏的东西,任何发现的问题都会以远快于商业厂商的速度去解决。千万别被那些软件公开的较短的bug列表所欺骗。
这意味着所有已知的攻击方式都会在被公开后得到迅速的处理,这种对安全的响应速度,是传统商业市场所无法想象的。但对于商业软件供应商来说,在解决问题之前,对外保密才是最重要的。PostgreSQL在这方面可以减轻您的顾虑,让您更放心。
多版本并发控制对您的好处
PostgreSQL选择了一种更适合大量insert,select负载的并发控制方式。
因此在对PostgreSQL进行模式设计的时候,需要控制Update,Delete的使用,大部分情况下,如果您认为数据很重要,你需要学习PostgreSQL提供给您的数据安全机制。
DDL在PostgreSQL中执行的时候,使用了事务机制。保证全部成功或者全部失败(避免最糟糕的情况:几乎成功的时候执行失败了,导致残余现场)。测试线路很容易处理,如果需要重置测试项目,仅仅只需要Rollback。
PostgreSQL实现了标准的隔离级别,包括序列化,读已提交,可重复读。这几种隔离级别都与ACID的完全兼容性。
PostgreSQL可以做所有的事情
比方,你需要NoSQL,Riak, REACT, Redis, Mongo之类?PostgreSQL都可以做到。虽然不可否认的是,PostgreSQL并没有覆盖到所有这些软件的功能列表,例如,PostgreSQL不会自己去创建shard,依然需要手动去做,但PostgreSQL有pg_partman插件可以做这个事情。
您需要列存储?比如hstore?您不想再让员工重新接受培训?以插件形式把您选择的语言加入到数据库,然后展开工作。您需要选择性复制表内容?逻辑流复制将会是一个很好的选择。
我花了很长时间来想我希望PostgreSQL中具备,但实际上没有或者没有其他扩展提供的功能。
您需要从其他系统中提取数据?PostgreSQL提供了最丰富的与其他数据库进行联合处理的处理方式。它们被称为外部数据包装(foreign data wrapper,也就是FDW插件),你可以直接把PostgreSQL连接到其他数据库进行查询,就好像这些都是PostgreSQL自己的数据表一样。
对地图数据的处理
PostGIS社区可能比PostgreSQL社区更大。PostgreSQL通过把PostGIS使用映射功能集成,达到了与类似功能的昂贵替代品一样的水平。
PostGIS项目之所以选择PostgreSQL作为平台,正是因为其易扩展性和广泛而丰富的数据功能。这些功能直接公开给其他任何项目使用,包括其他供应商,商业公司或者开源项目。
最终,您可以通过hook机制,将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的map支持?当然,使用python插件,然后去用。想要使用PostgreSQL作为后端来写一个Web服务?很酷的想法,PostgreSQL当然可以帮到您。JSON?OK。XML?你打赌试试。PostgreSQL直接支持所有这些并且不仅限于此。如果您想要使用一个语言并认为这个语言非常好,直接使用对应的插件来在PostgreSQL 服务端来使用它。
您可以创建自己的函数,数据类型,运算符,集合,窗口函数或几乎其他任何东西。没有看到您喜欢的功能?直接找到可以用的代码抄过来进行自定义。由于有许可证的允许,您可以自由地这样做。
PostgreSQL还提供了一些钩子函数,使您可以扩展数据库而不必在程序端处理。
吸收任何其他语言的任何功能的能力是PostgreSQL独有的。您可以使用现有的任何标准库提供任何功能。您也可以在使用标准版本的时候,保持对官方版本的后续更新,您自定义的功能也可以一起更新,这一切都是免费的。
大而广
PostgreSQL具有很多功能来充分利用已提供的硬件平台。分区,并行执行,部分索引,表空间,缓存和并行非阻塞维护例程(PostgreSQL中几乎所有东西最近都在使用CONCURRENTLY关键字)。
如果这还不够,那么物理流复制将以便宜的价格为您提供大量的只读从库。分片,内存缓存,队列,负载平衡和连接池都可以在PostgreSQL中使用。还不够吗?逻辑流复制怎么样?您想要对全世界的数据库进行基于地理位置的分片吗?好了,欢迎使用双向复制。
价格标签依然是0元。
索引所有内容
PostgreSQL支持如此庞大的索引列表,以至于使人难以确定如何使用它们。 GiST,SP-Gist,KNN Gist,GIN,BRIN和Btree都是可用的。通过扩展还可以得到很多其他功能,例如Bloom过滤器等。
PostgreSQL可以将这些索引功能与函数驱动索引,部分索引,覆盖索引和全文搜索结合使用。而这些扩展功能也不是互斥的,您可以同时使用它们。
推进,推出
已经提到的几种技术已经足以使PostgreSQL成为出色的数据集成和分发平台。多种复制形式,再加上多种形式的联合,为几乎任何类型的数据系统提供了推和拉的方式。
它们的组合是无限的,最终可以构成桥接数据库存储解决方案。所有这些都不需要任何ETL / ELT处理程序包。 PostgreSQL自己做到了这些事情。这个星球上最快的单一可信来源数据库是通过完全不将数据移出源数据系统来实现的。这意味着数据始终是最新的,并且响应时间是可以管理的。
如果您不能忍受源系统的不可靠性,或者希望在查询端获得更好的性能,则仍然可以使用物化视图定期缓存数据,物化视图也允许在查询时对其进行更新。
许可证是开放的
PostgreSQL拥有自己的许可证,该许可证主要基于BSD许可证。这允许其使用和分发上游更大的自由。
该许可证适用于主要项目的所有代码,主要贡献扩展,客户端库,连接管理器以及大多数相关工具。
它是高度宽容的,用普通英语写成,并且不需要为协议额外付费。
超棒的文档
PostgreSQL项目要求任何提交代码的开发人员都将提供对应的文档。这些文档将会以多种格式提供。该文档还用于评估功能部件本身,并作为开发未来功能部件的参考。
概况而言,文档赋予了PostgreSQL数据库生命力。有许多PostgreSQL开发人员已经学会了用C语言编写代码,数据库如何工作以及如何在使用PostgreSQL过程中项目应该如何管理。这个文档是首屈一指的。
测试驱动开发
PostgreSQL经过了广泛的测试————不,这还不够强烈。 PostgreSQL经过了详尽的测试。每个错误都会通过测试来验证其是否存在,并编写代码来满足该测试。新功能需要首先创建测试(和文档),然后再进行编码,直到开发完成。
这些测试已集成到构建过程中以进行回归,因此在以后的PostgreSQL版本中问题不会(再次)出现。这意味着在每个构建周期中,将为每个版本的PostgreSQL运行每个测试(仍然是最新的)。经过大量测试,可以确保PostgreSQL是可用的数据库中最稳定的数据库。
PostgreSQL仅在所有回归测试通过后才发布。提供“ 0个已知错误”版本。
国际化和本地化
PostgreSQL的开发人员来自世界各地。自PostgreSQL成为大学毕业生项目以来,他们就一直在使用多种本地语言工作。国际化和本地化已作为标准实践纳入PostgreSQL,随着PostgreSQL开始吸引全球商业市场,这不算什么。
尽管PostgreSQL出于兼容性原因将某些国际化委托给操作系统,但许多翻译都已经嵌入到系统中,提供了无缝的语言过渡体验。
云端作业
在多个云供应商中,PostgreSQL都使用了ansible,kubernetes或者专有工具来做到了云架构,除此之外,还有很多本地云的实现来匹配您的体系结构。
如果您想像牛(放养)而不是宠物(仔细照顾)那样对待服务器,PostgreSQL也可以在云中提供服务。
符合标准
PostgreSQL在项目的整个生命周期内一直是遵循标准的。由于PostgreSQL起源于大学的研究生课程,因此它已被用作许多SQL标准的参考实现。
PostgreSQL实现了SQL/Med(一个外部数据管理的SQL标准)和ANSI SQL(SQL标准语言)。
根据出色的文档,“ PostgreSQL支持SQL:2016的大部分主要功能。Core完整所需的179种强制性功能中,PostgreSQL至少符合160种。”这几乎比其他任何数据库引擎都多。
语言功能
PostgreSQL实现了公共表表达式(CTE),语言控制结构(if,for,case之类),结构化的错误处理以及您希望从成熟的过程语言中获得的所有好处。
你被说服了吗?
我仍然可以谈论由用户组,IRC频道,具有解决方案的网站,博客文章和导师组成的奇妙社区。 我可以对数据库跨平台,跨架构和跨文化的方式进行进一步探讨。另外还有无数个小时的演讲,视频和讲座。
或者,您可以直接下载它,看看它是否超出您的想象。我想您会感到非常惊喜。