编译 | 佑铭
参考-https://arcentry.com/blog/postgres-might-just-be-the-most-advanced-database-ever/(文-Wolfram Hempel)
转自 | 优达学城
作为一个技术人,我参与过的很多争论归根到底无非就是一个问题:尝试新技术还是坚持老技术?尽管这个问题总是争论不休,但对于少数技术来说,答案是简单的:两个都要!
Postgres 就是这样一项技术。1982 年开始开发、1996 年发布,至今已经 22 岁了。然而从很多方面来说,它仍是很现代的数据库管理系统。它不仅具有简直是令人难以置信的功能集,而且超越了单纯的数据库,演变成一个完全可编程的集成数据环境,并配有自己的编程语言 PL/pgSQL。
Postgres 有无数神奇之处,但在这篇文章中,我只会阐明使它成为 Arcentry 后端选择的 5 个卓越特性:
Pub/Sub 消息
Postgres 可以用作可群集的消息代理。 当然,它不像 RabbitMQ 或 Kafka 提供专用解决方案的功能集,但将基于事件的消息传递集成到更广泛的数据上下文中使 Postgres 极具价值。 例如,Arcentry 的内部部署版本使用了这种模式。 我们使用 Postgres-Messaging 作为横向可扩展部署的主干:
每当用户对任何图表进行更改时,Arcentry 都会向服务器发出请求,该请求会将更新合并到Postgres 中存储的二进制 JSON 文档中。 一旦确认写入,触发器就会触发一个所有其它已连接的服务器订阅的事件,并依次将更新转发给其活动用户。
这为我们提供了一种简单的方法来提供具有强一致性的水平可扩展实时更新 —— 所有这些都来自单个外部依赖。
触发器
触发器是在操作数据之前或之后运行的函数。 使用触发器是在数据库直接构建验证、转换和派生逻辑的绝佳方式。
触发器还提供了一种扩展现有数据库功能的简单方法。 例如,能够实现客户对 Arcentry 帐户表进行更改的不可变审计日志。
我们没有写一个额外的查询或服务接口,而是直接在 Postgres 写了一个触发器,一旦账号表中的一行有改动就运行,在一个单独的审计表中写入当前行的副本并加上时间戳和发起改动的 userID。
外部数据封装器
有时候,无论是查询用户账号还是将文档数据存储在已建立的结构,将用户现有的数据库集成到 Arcentry 中不失为一个好操作。 当然有很多方法可以实现这一目标,但一个特别方便的方法是用 Postgres 的[外部数据封装器 Foreign Data Wrappers](https://wiki.postgresql.org/wiki/Foreigndatawrappers)。
外部数据封装器是将 Postgres 连接到任意数量的其他数据源如 MongoDB,Redis,MySQL 甚至 CSV 或 JSON 文件的接口。 这样一来,对于查询语句来说,这些数据源就变成普通的 Postgres 表,可以连结、搜索、引用并成为数据库的有机组成部分 —— 让 Postgres 成为强大的集成工具和数据湖设置的潜在访问点。
JSONB
许多数据库采用 JSON 格式或其二进制表示,JSONB 存储 ——嗯,确实没什么新意。 但Postgres的操作功能使 JSON 成为基于表的关系数据库中的一等公民。 无论是输出查询结果是嵌套的 JSON 结构还是动态解析 JSON,Postgres 都可以优雅地处理。
插件
总有 PL/pgSQL 和触发器都不能满足需求的时候。对很多别的数据库来说,可能就这样了。但 Postgres 扩展性极强。写 Postgres 插件确实不容易( 相信我,我试过),但万幸的是,很多厉害的工程师已经为我们做好了开发工作,构建了很多让 Postgres 大变身的插件。
比如把 Postgres 服务器变成一个完全成熟的地理信息系统(GIS)空间数据库的 PostGIS 。
或者 PostlineDB 将 Postgres 变成时间序列存储/流处理器。
还有超多插件、工具和图形界面,戳 https://github.com/dhamaniasad/awesome-postgres 可以一览无余。
宝刀未老
让这一切真正不同凡响的是 Postgres 设立的典范:对于任何软件来说,22 年屹立不倒几乎是不可能的 —— 但保持不懈专注并投入数十年来完善、改进和优化已经很强大的核心足以打造一项 不管是现在还是 90 年代都举足轻重的技术。
— 完 —