本文翻译自Why Use Postgres (Updated for Last 5 Years),如有更好的翻译,欢迎推荐。
五年前,我写了一篇关于为什么你应该使用Postgres的文章。 几乎一年后,我加了一堆我落下的东西。 其中许多项都是重复的,我将在这篇文章的后半部分回顾一下。 在过去的4 - 5年里,已经有了很多改进和更多的原因去使用Postgres。 下面是您应该考虑使用Postgres这个优秀数据库的总结。
数据类型,包括JSONB和范围类型
Postgres一直以开放和友善的态度来添加数据类型。 它有数组、地理空间等。几年前,它有两个值得考虑使用的数据类型:
JSONB
JSONB是JSON的二进制表示形式。 它可以使用GIN和GiST索引类型进行索引。 您还可以查询完整的JSON文档以进行快速查找。
范围类型
虽然范围类型没有达到与JSONB相同的名声,但如果他们是你需要的,你可以非常方便。在单个列中,您可以有从一个值到另一个值的范围 - 这对时间范围特别有用。如果您正在构建一个日历应用程序,或者经常使用时间戳,那么范围类型可以将其放在单个列中。真正的好处是,您可以拥有某些时间戳不能重叠的约束或其他可能对您的应用程序有意义的约束。
扩展
在没有所有环境的情况下,很难谈论Postgres。对于社区和Postgres的发展,扩展越来越重要。扩展允许您非常自然的挂接到Postgres,而不需要将其提交到Postgres的核心代码。这意味着它们可以添加丰富的功能,而不必与Postgres版本和审核周期相关。一些很好的例子是:
Citus
Citus将Postgres变成一个分布式数据库,让您可以轻松地在多个节点上分割数据库。对于您的应用程序,它仍然看起来像一个单一的数据库,但是实际上它分布在多个物理机器和Postgres实例中。
HyperLogLog
这是我个人的最爱,它允许您轻松拥有预先汇总的足够紧密的计数,但随后也可以在工会,交叉点等等日子里进行各种操作。 HyperLogLog和其他草图算法在大型数据集和分布式系统中可能非常普遍,但是在Postgres开箱即用的情况下,非常的令人兴奋。
PostGIS
PostGIS不是新的,但值得再次强调。 它通常被认为是最先进的地理空间数据库。 PostGIS增加了新的高级地理空间数据类型、运算符,并且如果您正在处理映射或路由,可以轻松地执行许多您所需要的基于位置的活动。
逻辑复制
多年来,对Postgres的最大打击是设置复制的难度。 最初这是任何形式的复制,但是随后是流式传输复制(这是二进制WAL或预写日志格式的流)。 像wal-e这样的工具有助于利用Postgres的大部分机制来实现灾难恢复。
然后,我们在最近的版本中有了逻辑复制的基础,尽管它仍然需要Postgres的扩展,因此它不是100%开箱即用。最后我们得到了完全的逻辑复制。逻辑复制允许发送或多或少的实际命令,这意味着您只能复制某些命令或某些表。
Scale
除了所有可用性特征之外,我们已经看到Postgres在性能方面继续变得越来越好。特别是我们现在有了并行性的基础,在某些问题上你会看到更好的表现。那么如果您需要比单节点Postgres更大的Scale(例如RDS或Heroku上的122或244 GB的RAM),您可以选择像前面提到的可以帮助您扩展的Citus。
更丰富的索引
PostGres在GIN和GiST之前已经有一些非常强大的索引,那些现在对JSONB有用。但是,我们也看到了KNN指数和Sp-GiST的到来,并且还有一些正在到来。
Upsert
Upsert是一项进行了几年的工作。 这是大多数人用CTEs攻击的功能之一,但这可能会造成竞争条件。这也是MySQL超过Postgres的几个特性之一。 就在一年多前,我们得到了官方upsert的支持。
外部数据封装器
外部数据封装器确实在很多年前就已经存在了。如果您不熟悉外部数据封装器,则可以直接在Postgres中将外部数据系统映射到表格。这意味着例如可以使用SQL直接在Postgres中交互和查询您的Redis数据库。 他们从5年前的发展中得到越来越多的改善。特别是我们支持可写入的外部数据封装器,这意味着您可以直接在Postgres中将数据写入其他系统。现在还有一个官方Postgres FDW开箱即用,它在查询各种Postgres实例时本身是非常有用的。
更多
如果您错过了以前的版本,请随时查看。关键点包括:
- 窗口函数
- 函数
- 自定义语言
- NoSQL数据类型
- 自定义函数
- 公共表表达式
- 并行索引创建
- 事务DDL
- 外部数据封装器
- 条件和函数索引
- 监听/通知
- 表继承
- 每事务同步复制