当前位置: 首页 > news >正文

资深研发的心愿:PostgreSQL未来若能加入这些功能,将更臻完善

我们已经与 PostgreSQL 和其他数据库一起工作了一段时间。在数据库管理领域,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 集成

file

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

总结

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构详细解释
  • 位运算+前缀和+预处理,CF 1017D - The Wu
  • CCF推荐A类会议和期刊总结(计算机网络领域)- 2022
  • 5、Kafka
  • HTML高级技术解析与实践指南
  • Windows环境下 VS2022 编译 LAME 源码
  • 【Redis】为什么选择 Redis 做缓存?
  • 【ShuQiHere】初识 Node.js:服务器端 JavaScript 的强大之处
  • Spring1~~~
  • ONU测试需要那些协议的学习
  • 第三章 Mybatis 常用工具
  • 【学习笔记】手写 Tomcat -- 预备知识
  • freemarker模板学习笔记
  • 【C#编程技术总结】魔法包唤醒同一局域网设备
  • Unity解析XML开发随机名字生成模块
  • [PHP内核探索]PHP中的哈希表
  • 【Leetcode】104. 二叉树的最大深度
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • android 一些 utils
  • Centos6.8 使用rpm安装mysql5.7
  • CSS魔法堂:Absolute Positioning就这个样
  • iOS | NSProxy
  • Java应用性能调优
  • magento 货币换算
  • Theano - 导数
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 从重复到重用
  • 如何用vue打造一个移动端音乐播放器
  • 思考 CSS 架构
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • puppet连载22:define用法
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • !!Dom4j 学习笔记
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $.ajax()参数及用法
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十)T检验-第一部分
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (未解决)macOS matplotlib 中文是方框
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)EOS中账户、钱包和密钥的关系
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core WebAPI中封装Swagger配置