Hacker News 中文摘要

RSS订阅

PostgreSQL 18 新特性解析——开发者视角 -- What’s New in PostgreSQL 18 – a Developer’s Perspective

文章摘要

PostgreSQL 18于2025年9月25日发布,为开发者带来了多项实用功能。最显著的是新增了原生UUID v7支持,通过uuidv7()函数生成兼具全局唯一性和顺序性的ID,解决了主键选择难题。此外还优化了开发者日常工作中的其他特性,提升了数据库使用体验。

文章总结

PostgreSQL 18 开发者视角新特性解析

PostgreSQL 18 于 2025 年 9 月 25 日正式发布,虽然最重大的变化是新的异步 I/O(AIO)子系统,但本文重点介绍对开发者日常工作有直接影响的功能改进。

一、原生 UUID v7 支持

PostgreSQL 18 新增了生成 UUID 版本 7 值的 uuidv7() 函数。UUIDv7 兼具全局唯一性和序列化特性,解决了长期存在的关于使用 SERIAL/IDENTITY 还是 UUID 作为主键的争论。开发者现在可以直接使用内置函数创建 UUIDv7 主键表,无需依赖第三方扩展或应用层实现。

二、虚拟生成列

PostgreSQL 18 为生成列引入了 VIRTUAL 选项并设为默认行为。与需要存储空间的 STORED 生成列不同,虚拟列在查询时实时计算值,具有以下优势: 1. 节省存储空间 2. 支持动态计算(如依赖系统状态的运算) 但需注意虚拟列不能创建索引,且逻辑复制仅支持 STORED 生成列。

三、RETURNING 子句增强

现在可以在 DML 操作中通过 RETURNING 同时获取新旧值: - UPDATE:可对比修改前后的价格差异 - INSERT ON CONFLICT:可识别新增/更新记录 - DELETE:可查看被删除的数据 这项改进显著简化了审计日志等场景的实现。

四、EXPLAIN ANALYZE 默认显示缓冲区信息

优化器诊断命令现在默认包含缓存使用情况,无需额外指定 BUFFERS 选项。自动显示的 I/O 信息帮助开发者更容易发现潜在性能问题。

五、权限检查函数 pggetacl()

新增的统一权限检查接口解决了以往需要查询不同系统目录的麻烦,通过单一函数即可查看任意数据库对象的访问控制列表,极大简化了权限问题排查流程。

这些改进虽然不如 AIO 子系统引人注目,但能切实提升开发效率。特别是像 pggetacl() 这样的标准化接口,不仅方便开发者,也为 AI 工具提供了更清晰的数据访问方式。

评论总结

以下是评论内容的总结:

  1. 关于PostgreSQL权限查询功能的讨论

    • JoelJacobson提到pggetacl()函数的添加受到用户欢迎,但认为权限查询仍有改进空间。他建议添加pgownerships和pgprivileges系统视图,但因缺乏用户兴趣暂时搁置。
      引用
      "It made me happy to see the pggetacl() function... is appreciated by users."
      "If there is enough interest from users, I might consider picking up the task..."
  2. 关于计算列的争议

    • dangoodmanUT反对计算列,认为计算逻辑应放在客户端以避免不必要的数据库资源消耗。
      引用
      "Why would you ever force your db to multiply a value by 12... if it’s not for filtering?"
    • cyberax则支持计算列,特别是在变更流记录中的应用,认为其非常实用。
      引用
      "For me: computed columns in change stream records. Super nice."
  3. ORM与数据库功能的矛盾

    • IgorPartola指出,尽管PostgreSQL不断添加新功能,但ORM的抽象层使许多功能无法被利用,导致开发者被限制在通用功能上。
      引用
      "as databases like Postgres keep adding cool new features they mostly go unused because an ORM just doesn’t let you pierce that layer..."
      "I both see why RDBMS is the right choice most times AND see the appeal of an object store..."
  4. 触发器功能的缺失

    • JakaJancar提到PostgreSQL缺乏在数据库或模式级别定义触发器的能力,导致需要重复编写和管理触发器代码。
      引用
      "One obvious thing I still can’t believe pg doesn’t have is the ability to define triggers at the database or schema level."
      "I must have written code to mass generate DROP/CREATE TRIGGER probably 5 times..."

总结:评论涉及PostgreSQL的功能改进、计算列的实用性、ORM的限制以及触发器功能的不足,观点多样且具有实际应用背景。