老研发心声:期待PostgreSQL新增这些实用功能

发表时间: 2024-04-19 16:04

数据库管理领域,PostgreSQL 以其稳健性和灵活性脱颖而出。然而,随着开发人员在现代应用程序开发的复杂性中航行,还有一些额外功能可以简化他们的工作流。以下是我希望 PostgreSQL 具备的功能,让研发工作更加轻松。

带版本记录的 Schema

PG Catalog 仅存储当前最新的 schema。Schema 变更工具通常需要创建外部表来存储 Schema 变更的历史记录。内置的带版本记录的 schema 能带来如下好处:

  1. 标准化格式。例如版本号格式,表示 schema 变更是否正在进行中的状态。
  2. 一致性。当 schema 变更历史存储在外部时,很难完全保证变更历史与实际 schema 之间的一致性。
  3. 回滚。如果新的 schema 变更引入了问题,版本控制允许安全地回滚到以前稳定状态,最大程度地减少停机时间和对用户的影响。
  4. 流程控制。有了带版本号的 schema 变更状态和历史记录,就更容易强制要求数据库上任何时候只能运行一个 schema 变更。

在线 Schema 变更

多年来,PostgreSQL 一直在这个领域持续迭代,但仍然存在一些情况下变更 schema 会阻塞数据库的读写。pg-osc、reshape 等工具旨在解决这个问题。理想情况下,PostgreSQL 可以封装耗时的 schema 变更过程:

  • Schema 变更过程中创建的临时表是内部表。因此不会污染用户空间。
  • Postgres 只要把 schema 变更的进度百分比暴露出来。

分支

在开发过程中,最好拥有一个高仿真度的测试环境,尽可能接近生产环境。这里的挑战在于能够快速基于生产环境创建测试数据库(为了合规性,还需要清理敏感数据)。如果 PostgreSQL 可以像 Git 一样具有即时创建分支的能力呢?

归档表

为了防止误删数据,我们通过添加一个 is_deleted 列来,这就是所谓的软删除 (soft-delete) 模式。然而,这给外键、唯一索引带来了额外的复杂性。理想情况下,PostgreSQL 可以允许用户配置一个归档表。被移除的数据首先会被移到归档表中,并在过了配置的保留期 (retention period) 后清除。这可以简化应用逻辑和数据合规工作。

标签

PostgreSQL 允许向对象添加 SECURITY LABEL。我希望它可以扩展成一个更通用的标签系统,用户可以附加任意的KV 对。这在数据字典、报告和编排开发者工作流中将会很有用。例如:

  • 查找特定应用程序拥有的所有数据库/表。
  • 当更改与某个标签匹配的表时需要额外审查。

Git 集成

Snowflake 在它的 2023 summit 上也推出了 Git 集成这使开发人员能够将存储过程、自定义函数和祖传运维脚本和代码放在一起。因此,他们将采用统一的版本控制最佳实践。类似于 Foreign Data Wrapper (FDW) 的实现方式,PostgreSQL 内核可以提供基础架构,而和特定的版本控制系统集成可以通过扩展来实现。

总结

关于数据库开发工作流,Git 始终是灵感的源泉,困难之处在于 Git 是为管理无状态的代码而生,如何能移植到管理有状态的数据库上。业界也有不少公司在不断拓展前沿:

  • Neon 重写了 Postgres 引擎,实现了 serverless 和即时分支。
  • Xata 提供 serverless、分支,以及在线 schema 变更。
  • Snaplet 用于生成合规的测试数据库。
  • Supabase 则是围绕 Postgres 构建了整个应用开发平台。
  • Bytebase 统一所有人与 Postgres 的操作,包括 schema 变更、临时数据订正、数据访问控制和动态脱敏。

你最希望有的 PostgreSQL 功能是什么?欢迎大家在评论区留言。