22岁的Postgres可能是最先进的数据库


作为一个技术人员,我参与的许多辩论可归结为一个问题:我们应该选择新的东西还是经过验证的东西?尽管讨论这个问题充满热情,但有一些技术的答案很简单:为什么不两者兼而有之?
Postgres就是这样一种技术。它最初于1996年发布(自1982年以来有效开发),现在已有22年历史 - 但在许多方面,它是最现代化的数据库管理系统。它不仅具有简单令人难以置信的功能集,而且还超越了纯数据库,并演变为完全可编程的集成数据环境,并配有自己的编程语言PL / pgSQL。

在这篇文章里,我想阐明使它成为我们Arcentry公司的后端数据库选择的五个非凡功能:

发布/订阅消息
Postgres可以用作可群集的消息代理。当然,它没有像RabbitMQ或Kafka这样的专用解决方案提供的功能集,但它将基于事件的消息传递集成到更广泛的数据上下文中使其极具价值。例如,Arcentry的内部部署版本使用了这种模式。我们使用Postgres-Messaging作为横向可扩展部署的主干。

每当用户对任何图表进行更改时,Arcentry都会向服务器发出请求,该请求会将更新合并到Postgres中存储的二进制JSON文档中。一旦确认写入,触发器就会发出一个事件,即所有其他连接的服务器都已订阅,然后将更新转发给其活动用户。

这为我们提供了一种简单的方法来提供具有强一致性的水平可伸缩实时更新 - 所有这些都来自单个外部依赖。

触发器
触发器是在操作数据之前或之后运行的函数。它们是将验证,转换和派生逻辑直接构建到数据库中的绝佳方式。
触发器还提供了一种扩展现有数据库功能的简单方法。例如,提供对Arcentry帐户表进行更改的不可变审计日志。
我们只是将一个触发器编程到Postgres中,而不仅仅是在帐户表中的行被更改时运行,包括写入当前行的副本也会触发,将时间戳和启动更改的userId保存到单独的审计表。


外国数据包装
有时,将用户现有的数据库集成到Arcentry中是很好的 - 无论是查询用户帐户还是将文档数据存储在已建立的结构中。当然 - 有很多方法可以达到这个目的,但是Postgres的外部数据包装器特别方便。

这些是将Postgres连接到任意数量的其他数据源的端点,例如MongoDB,Redis,MySQL甚至CSV或JSON文件。就查询语句而言,这些源只是常规的Postgres表,可以加入,搜索,引用并成为数据库的有机组成部分 - 使Postgres成为强大的集成工具和数据湖设置的潜在访问点。

JSONB
许多数据库存储JSON或其二进制表现模型:JSONB - 我发现这不会引起太多的兴奋。但Postgres的操作功能使JSON成为基于表的关系数据库中的一等公民。无论是输出查询结果是嵌套的JSON结构还是动态解析JSON,Postgres都可以很好地处理它。


附加组件
然而,有时PL / pgSQL和触发器都不足以实现所需的功能。对于许多其他数据库,这只是它的限制之处 - 但Postgres令人印象深刻的可扩展性。编写Postgres插件并不是一件容易的事(相信我,我试过),但幸运的是,许多有才华的工程师为我完成了工作并构建了将Postgres变成完全不同的产品的扩展。

PostGIS为例,它将Postgres服务器变成一个完全成熟的地理信息系统(GIS)空间数据库。
或者将Postgres变成时间序列存储/流处理器的PipelineDB怎么样?
有任意数量的Postgres扩展,工具和GUI,可在此处找到概述

爷爷也很时髦