ESC
开源 1 分钟阅读

PostgreSQL:万物皆可PostgreSQL

PostgreSQL虽是1996年发布的老牌数据库,但社区活跃、功能不断现代化,如今已成为全能型数据平台。它不仅能做关系型数据库,还可替代全文搜索、NoSQL、消息队列、时序数据库、向量数据库甚至缓存系统。云服务商一键部署,生态完善,维护成本低,值得开发者优先考虑。

来源:Hacker News

PostgreSQL是过时的老技术?它的第一个版本可以追溯到1996年。同时PostgreSQL也被广泛使用了很长时间。消除bug——尤其是数据库系统中的bug——需要时间。PostgreSQL拥有足够的时间。

它还有一个非常活跃的社区,在不破坏旧功能的前提下,不断添加越来越多的新特性。近年来,PostgreSQL获得了许多令人惊叹的功能,如JSON文档存储、分区支持、公共表表达式等等。每个新版本的PostgreSQL都令人兴奋,并带来新的优秀特性。

诚然,PostgreSQL很古老——但它的功能非常非常现代——而且PostgreSQL每个版本都在变得更好。

PostgreSQL可以非常容易地在本地安装。它捆绑在所有主流Linux发行版中,是Mac brew的一部分,也可以通过PostgresApp等应用程序安装。

在运行测试时,使用Testcontainers搭配PostgreSQL非常方便。针对一个与生产环境100%相似的真实PostgreSQL数据库运行测试,从未如此简单。

如果你想在服务器上运行PostgreSQL,只需apt-get install即可。或者在Docker容器中运行。

所有云服务商都允许你通过单击一个按钮来运行(甚至扩展!)PostgreSQL。你有充足的选择:

这使得PostgreSQL成为市场上最广泛支持的软件系统之一。对你而言,这意味着更少的维护,更多的时间为客户创造新功能。

在云上运行PostgreSQL已经只需一键操作。但还有更好的。PostgreSQL可以取代许多否则你需要单独运行的系统。

PostgreSQL允许你将文本数据转换为用户可搜索的数据,无需单独的系统。它也是语言无关的,而且你永远不会遇到数据与全文搜索系统之间的同步问题。

关于这个话题最引人注目的文章是Contentful如何使用PostgreSQL为其用户启用全文搜索。这是一个简化带来增长的案例。

Instacart也做了非常类似的事情:他们在Postgres上构建了现代搜索基础设施,而不是运行单独的搜索集群。同样的故事,不同的公司。

更多信息:https://www.postgresql.org/docs/current/textsearch.html

PostgreSQL对存储和查询(!)JSON有着出色的支持。它还拥有一种索引类型(GIN),使这些操作极其快速。还有必要使用MongoDB吗?

《卫报》也写了一篇很棒的文章,讲述他们如何从Mongo切换到PostgreSQL。感谢Jan-Otto的分享!Hazel也写了一篇关于jsonb以及使用它时需要注意的事项的好文章。

事件、队列和持久化日志在当今软件系统中变得越来越重要。Kafka、RabbitMQ、SQS等系统提供了这些功能。但维护它们很麻烦、很定制化,而且你需要相应的技能。

好消息是:你完全可以只用PostgreSQL。神奇之处在于:

利用这些SQL特性,你可以有效地将表用作队列。既可以采用游标和多个消费者的持久化方式,也可以采用只读一次的方式。

crunchydata上的文章很好地解释了这个概念。

我的建议:先用PostgreSQL作为队列系统。只有当它不再表现良好时,再切换到Kafka、RabbitMQ或SQS等系统。你会惊讶于PostgreSQL的表现有多好。

时序数据很特殊。通常你会在极短时间内获得大量数据点。然后你必须频繁地聚合数据,进行一些统计分析等等。

有专门的软件系统,比如Clickhouse(顺便说一句,它很棒……)。但你也可以使用PostgreSQL的一个插件来做(几乎)相同的事情:Timescale。

我用过Timescale,可以推荐它。好消息是,你可以继续使用PostgreSQL——即使对于高容量数据也很轻松。无需学习和维护新东西。

Timescale最近发布了pgvector扩展,将你的PostgreSQL变成向量数据库。这使你可以使用已经熟悉的技术来索引和检索相关数据。这是AI LLM工作流的重要组成部分。

Timescale还最近宣布了pgai,它包含pgvector,还有许多其他优秀的扩展,使索引数据、调用LLM模型和基于相似性检索数据变得超级简单。

缓存很重要。大多数应用程序使用Redis之类的缓存来快速获取会话等信息。缓存按定义可以丢失数据,可以从原始来源重新生成。

但是,当PostgreSQL可以通过调优在大多数用例中达到与Redis缓存一样快时,为什么还要用Redis呢?秘诀是使用UNLOGGED表。你甚至可以通过触发器模拟Redis的自动过期。关于这一点已经写了很多——我只能建议你尝试一下。

对于我的一个客户,我们必须读写大量的二进制编码信息小块。我们最初认为通过文件系统这样做是最快的方式。