Postgres:包含电池的数据库

2020-11-25 03:45:47

在我工作过的大多数地方,使用的主要语言都不是我自然喜欢的语言。如果您要亲自询问选择的语言,那就是python。我很欣赏这种显式的本性,它通常是可以执行的伪代码,并且具有丰富的库生态系统(尽管如今这是大多数语言)。但是,在我早期使用Django时,我所获得的东西就不胜枚举。如果您不熟悉Django,那么它是使用Python编写的Web应用程序的流行框架。我特别喜欢的是它早期的标语之一:包括电池。

就在最近,我在变更日志Podcast上谈论“ Postgres有什么令人兴奋的地方?”我讨论了一段时间,也许可以继续进行下去,其中许多功能都是我们使用Crunchy Bridge构建的功能中的首要考虑因素。通过对事情的反思,我可以看到与我在PostgreSQL的Django中欣赏的东西有很大的相似之处。对我而言,Postgres是包含电池的数据库。那么PostgreSQL框中是什么:

对我来说,没有什么比数据更重要。知道我的数据是安全的是非常关键的。无论是我的银行结余还是我的食品订单,当我以某种方式进行交易时,我都想知道其中的数据。我构建的应用程序也是如此,而PostgreSQL在这里一直是可靠且安全的数据库。 Postgres MVCC的核心是一种可靠的方法,可帮助确保交易一致性水平,同时仍可大规模运行。在单个PostgreSQL实例中,每秒数十万个事务确实可以相当容易地管理。

多年来,它也不断发展壮大,变得可靠。数据类型占了很大一部分。从表面上看,数据类型似乎并不值得一提,但并非所有数据库都支持您每天在应用程序中使用的类型。只是一些值得注意的:

范围类型-尤其适用于需要往返时间的日历,它具有强制执行约束的功能。

时间戳-使用任何语言的时间都是很痛苦的事情,带有时区的时间戳使转换变得更加容易,再加上时间间隔,使得像在上一小时注册的用户这样的事情变得微不足道。

JSONB-多年来,这一功能已经引起了广泛关注,但对于许多人来说,它仍然是新事物。可以使用GIN索引轻松索引的二进制JSON数据类型。

SQL是数据的通用语言。 SQL源于关系代数和关系演算,这使它成为处理数据的一种经过深思熟虑的语言,即使它并不总是最漂亮的语言。 SQL是数据的标准语言,每个没有SQL的NoSQL数据库最终都会重新创建其SQL版本,因为这是正确的数据答案。

在Postgres中,您拥有访问数据的所有标准方式,然后,您还获得了更多的异国情调:

CTE(公用表表达式)-用于编写更复杂的查询,递归并使SQL可读。

窗口功能-非常适合进行分析,例如排序结果,计算中位数和百分位数。

函数-Postgres已经提供了大量的函数来执行常见的操作,例如日期数学,解析字符和其他琐碎的事情。

这个好朋友拉赫(Rach)在一篇帖子中总结了所有这一切,远胜于我:“ Postgres全文搜索就足够了!” -简单阅读即可。

这里更广泛的观点是,如果您有一个现有的应用程序并且要向其中添加搜索,那么在寻求弹性(然后必须将其同步到该系统并维护和支持该系统)之前,请考虑使用一些您已经支持并包含数据-Postgres。

这本身就是一个整体。 PostGIS是最先进的地理空间开源数据库。它是Postgres的扩展,但我将其与其他扩展放在一个特殊的类中。随着扩展变得越来越先进,从一开始,PostGIS就已经变得非常丰富和先进。 PostGIS拥有自己的社区,该社区与Postgres有点类似,并定期发布扩展的主要版本和次要版本。

启用PostGIS(只需创建CREATE EXTENSION postgis;),即可立即获得一个地理空间数据库。它带来了新的数据类型,新的空间谓词,用于查询这些几何并与之交互。您可以走得更远并启用pgRouting,这有助于进行路线规划。希望找出如何优化3个驾驶员的10个食物交付以优化路线和时机的方法吗? PostGIS可以提供​​帮助。

实际上,我们只是结束了马拉松式PostGIS的一天,这一天从东海岸开始,然后在西海岸结束。当天结束后,我们将在不久的将来发布这些演讲,因此,如果您想在直播时获得一些更新,请随时注册。

我想我在使用PostGIS时有点混乱。备份一下……扩展是Postgres特有的。就个人而言,这个名字并不能真正传达出他们的力量和价值。扩展程序允许您扩展和更改Postgres的功能,但Postgres所具有的独特之处是。 Postgres具有这些深层次的底层挂钩,使您可以执行诸如添加新数据类型,新功能甚至将挂钩插入查询计划器的操作。

Postgres附带了一些股票扩展功能,您可能仍需要启用它们,但至少您可以使用它们。 pg_stat_statements是存在的最有用的扩展之一,它是由我的同事Peter Geoghegan在Postgres 9.2中编写和更新的,非常有用。它将使您几乎立即获得30,000英尺的数据库性能视图,而不必深入研究应用程序来了解正在调用的查询。

扩展列表很长。 PGXN,即Postgres扩展网络,具有200多个扩展的索引,其中一些已经准备就绪,可以投入生产。所有人可能都值得自己深入研究,但其中一些值得一提的重点是:

pg_partman-一个扩展,它建立在Postgres中的本地时间分区上,以使处理时间序列数据简单而高效。对我来说,这是一个不错的奖励,它是由Crunchy Data同事维护的。

pgsql-http-一个简单的扩展,但可能非常有用,它允许您发出http请求。想触发网页挂钩吗?从您的plpsql或plpython调用API?

zhparser,pgroonga-尽管是两个不同的扩展名,但我将这两个分组在一起。如果您要进行全文搜索,但Postgres原生支持不起作用(日语和中文)。这是你的答案。

madlib-谁需要一个完整的ETL和数据科学流水线,何时才能在数据所处的位置(在Postgres中)做所有事情。 Madlib从某个周末开始并不是一个新的爱好库,它已有近10年的历史,并且广泛地支持数据科学。朴素的贝叶斯,k均值,草图估计-自2011年1.0版发布以来,所有这些都已经存在。它是Apache基础的一部分,并且会不断发展,并且可以轻松访问Postgres中的数据科学。

postgres_fdw-外部数据包装器(FDW)是一种有趣的扩展类,它使您可以从Postgres内部查询其他内容(请阅读:另一种Postgres,Redis,Mongo,您为它命名)。如果有任何FDW可以投入生产,则是Postgres本身随附的Postgres。

Crunchy Bridge(我们的多云PostgreSQL托管服务)的目标很大一部分是利用广泛的扩展生态系统,以便您可以对数据库做更多的事情。

8年前,我写了一篇博客文章,解释“为什么Postgres”是您应该考虑使用的数据库。五年后,我发布了具有一些更新的新版本。我什至还没有达到扩展或可插拔存储可能存在的迷人未来。 (想要在Postgres中使用柱状存储...我保证有一天会在这里,也许比您想象的要早)。

但是今天,如果您回答的全部都以上,则无需选择Postgres的理由。今天的问题已经真正转移到您不打算使用Postgres的目的上,以及社区如何更好地支持将来在Postgres中发生的事情。

这是我们处理“松散数据”和我们所相信的内容的核心。作为一个社区,我们如何才能使Postgres成为一个强大的开源数据库,并继续在其中包含更多内容?这就是我们现在已经花费了近十年的时间来帮助人们运行和支持生产PostgreSQL的原因,无论是基于VM的HA设置,还是通过PostgreSQL Operator在Kubernetes上,或者最近在我们的数据库即服务中。

当我今天在Django网站上浏览时,我发现“包含电池”已从该框架的主要用途逐渐淡出,因此,我借此机会统领Postgres这个词组,它实际上是一个完整的包含电池的数据库。