首页
/ EdgeDB 中支持 DML 操作函数的实现方案

EdgeDB 中支持 DML 操作函数的实现方案

2025-05-16 07:43:32作者:齐冠琰

在 EdgeDB 数据库系统中,开发团队正在讨论如何更好地支持包含数据操作语言(DML)的函数。这类函数能够执行插入、更新或删除等操作,同时还能返回操作结果,为开发者提供了更强大的数据操作能力。

当前实现的问题

目前 EdgeDB 虽然通过一个标志位允许函数包含 DML 操作,但实现方式存在明显缺陷。系统会将 DML 语句直接嵌入到 PostgreSQL 函数中执行,这种方式存在两个主要问题:

  1. 优化器可能会将这些 DML 操作优化掉,导致操作不被执行
  2. 函数无法正确返回创建的对象,限制了使用场景

解决方案:函数内联

技术团队提出了通过函数内联(inlining)来支持 DML 操作的方案。这种方法不是将 DML 语句直接编译到数据库函数中,而是在查询执行时将函数体展开内联到调用位置。这种方式能够:

  • 避免优化器错误地消除 DML 操作
  • 确保操作结果能够正确返回
  • 提供更好的性能优化机会

语义设计挑战

实现过程中面临一个重要的语义设计问题:如何处理参数为集合类型的函数调用。例如,考虑以下函数定义:

function make_user(name: str) -> User 
using (insert User { name := name })

对于简单调用如 select make_user('Bob') 行为明确,但当参数是空集合或多值集合时:

  1. select make_user(<str>{})(空集合)
  2. select make_user({'foo', 'bar'})(多值集合)

技术团队经过讨论确定了两种可能的处理方式:

  1. 根据参数集合的基数隐式决定执行多少次插入操作
  2. 对非单值参数直接报错,拒绝执行

团队最终选择了第二种方案,主要基于以下考虑:

  • 保持与现有 DML 操作行为的一致性(EdgeDB 明确禁止基于参数基数隐式执行多次 DML)
  • 提高代码的明确性和可预测性
  • 避免潜在的性能问题和意外行为

实现意义

这一改进对于 EdgeDB 的网络模块开发特别重要,将为开发者提供更灵活的数据操作方式。通过支持 DML 操作函数,开发者可以:

  • 封装复杂的数据操作逻辑
  • 实现更清晰的数据访问层
  • 构建更强大的业务逻辑组件

同时,通过严格的参数基数检查,系统保持了良好的行为可预测性,避免了隐式多值操作可能带来的混淆和性能问题。

这一改进体现了 EdgeDB 团队在提供强大功能的同时,坚持明确性和一致性的设计理念。

登录后查看全文
热门项目推荐
相关项目推荐