作者:柯克·罗伊巴尔 Kirk Roybal是PostgreSQL的狂热者,并定期为2ndQuadrant博客做贡献。
前言
首先声明,我不是标题党,刻意诱惑点击或夸大描述。我打算证明,无论有没有金钱方面的考虑,通过设计和实现,PostgreSQL都可以客观,可衡量地比当前可用的数据库更好。
究竟我怎样才能证明这样一种崇高的说法是正确的呢?
继续阅读,可爱的读者。我保证不会浪费您的时间。
安全透明
PostgreSQL有一个安全邮件列表。PostgreSQL项目组与其他所有人在同时学习入侵向量。没有什么是隐藏的,任何发现的东西都以使商业供应商头晕目眩的速度进行工作。供应商提供了正在审查的软件,他们所提供的的缺陷列表会更简短。
这意味着所有已知的攻击载体一旦公开就会被处理。这种安全响应能力在商业领域甚至是不可估量的。对于商业供应商来说,在问题得到解决之前保密对补救至关重要。PostgreSQL却没有这样的限制,这是不是很棒呢!
多版本并发控制对您有好处
PostgreSQL选择了一种并发控制方法,该方法最适合高INSERT和SELECT工作负载。
PostgreSQL的设计非常简单,只需记住更新和删除的跟踪开销。重要的是,如果您尊重数据,则应该尝试拥抱PostgreSQL为您提供的数据安全性。
PostgreSQL中DDL也能参与事务。完全迁移或完全无效(最糟糕的一种无效方法是近乎马上完成的废弃)。测试用例也可以重建。需要重置测试工具吗?答案是只需回滚事务。
PostgreSQL支持符合标准的事务隔离形式,包括序列化,已提交读和可重复读。这些方法完全符合ACID标准。
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频道、有解决方案的网站、博客文章和导师的奇妙社区。对于数据库是跨平台、跨体系结构和跨文化的,我可以从哲学的角度进行阐述。有无数个小时的演讲、视频和讲座。
或者,您可以直接下载它,看看它是否超出您的想象。我想您会感到非常惊喜。
PG考试相关详情:http://www.pgccc.com.cn/