Acadia:用 Elm 风格重塑数据库编程

Rethinking Database Programming

多年来,我一直在尝试将 Elm 等现代语言的类型安全优势带入 SQL 世界。面对 SQLite 和 PostgreSQL 等强大数据库,我希望能让现代开发者的体验更便捷。Acadia 项目应运而生,它支持自定义类型、编译时验证的数据库迁移、友好的错误提示以及端到端的类型共享。通过定义表结构和端点,Acadia 能在编译时将函数式代码直接转换为高质量的 SQL,彻底解决类型不匹配和手动转换数据的痛点。现在,Acadia 已进入公开 Alpha 阶段,支持 Elm 和 Haskell,并计划扩展更多语言。

当我进入生产数据库执行操作时,我的身体会进入高度警戒状态。
  1. mike_hearn

    在非 SQL 编程语言中定义模式的痛点在于,它们总是落后于底层数据库所能提供的功能。当然,你的类 ORM 框架可以定义主键、甚至唯一性约束等基础内容,但它能定义分区方案、压缩方法或更高级的约束吗?

    看看这里支持的所有功能:

    https://www.postgresql.org/docs/current/sql-createtable.html

    再考虑到其他数据库支持的功能甚至更多。如果你用代码来管理模式,就会失去对这些功能的访问权限,最终还是要写 SQL。

    对于查询来说,问题没那么严重,尤其是如果你有一个不错的编译器。不过,我最近对 SQL 封装/抽象层失去了信心。通常的理由是很多开发者不太懂 SQL,但 LLM 在这方面很擅长。让 LLM 写 SQL 比写一些不太熟悉的 DSL 更容易。而且 SQL 本身就是设计得相对易读的,尤其是如果你正确使用 CTE 和视图,应该可以将逻辑提取出来,让即使复杂的查询也变得易于理解。

    对于 Acadia 这类框架,真正的问题是:假设我精通 SQL 并且熟悉数据库的所有功能,这个框架能给我带来什么?因为这就是 LLM 看待它的视角。

  2. CopyOnWrite

    到现在为止,我已经懒得去数那些试图取代 SQL 的尝试了。

    SQL 确实有很多值得批评的地方,如果某些设计能有所不同,我会非常高兴。

    另一方面,关系型数据库背后的架构和数学原理简单、可组合,并且经受住了时间的考验,这一点比大多数其他设计、方法论或软件开发方法都要强。

    虽然 SQL 可以改进,但即使以我平平无奇的 SQL 水平,我也从未在从数据库获取信息时遇到过困难,像窗口函数这样的高级功能甚至让我觉得标准 SQL 都是图灵完备的。

    SQL 拥有原生数据库支持,对于大多数公司来说,数据和数据库的寿命都会超过任何特定的应用程序,甚至超过整个编程语言/平台生态系统(Visual Basic、Visual FoxPro、Python 2 等)。

    此外,我们拥有关于 SQL 和 SQL 数据库的绝妙书籍、知识、ORM、查询构建器以及庞大的工具生态系统。

    Acadia 从技术角度看可能很棒,但这并不重要,因为它看起来并没有比 SQL 带来足够大的改进,以至于值得去投资它。我宁愿去提升我对标准 SQL 的知识,或者加深对特定关系型数据库的了解。

    最后,Acadia 似乎并没有比其他 ORM/查询构建器提高多少门槛。我理解从函数式编程(FP)的角度来看,map/filter 比 SELECT ... WHERE 更优雅,但在参与的一些项目中,最终还是会直接操作数据库……

  3. dwohnitmok

    我对那些试图“拥有”数据库的语言持谨慎态度。特别是“与 SQL 共存”这一说法似乎有点可疑,因为例如 sum types(和类型)有自定义的二进制编码,这使得它们很难与其他语言进行互操作。这使得所谓的与其他语言的互操作更像是一个通往全面采用 Acadia 的临时落脚点,而不是一个可行的长期平衡状态,除非你例如放弃使用 sum types。(我也怀疑,尝试原生支持 sum types 可能会导致一种函数式编程版的 ORM 阻抗不匹配。我用关系逻辑建模数据的方式,与用代数数据类型建模数据的方式可能大相径庭,我想知道强行将后者塞入前者,是否会导致与强行将对象塞入关系逻辑时相同的问题)。

    这使得数据库更像是 Acadia 编译的目标,而不是 Acadia 构建在其之上的基础。从我自己的开发者经验来看,这感觉不对劲,因为我通常期望数据层是老大,应用代码围绕它展开,而不是在代码中创建数据表示,然后基于此创建数据库(这也是我不喜欢 ORM 之类东西的原因)。

    总的来说,我认为数据库通常比应用代码具有更长的生命周期,尤其是随着时间的推移积累了更多数据之后。对于严肃的生产级应用,数据库往往能存活多次生产应用的重写。

    我怀疑……

  4. gbjcantab

    我没看出这里有什么特别之处。Haskell 在十多年前就有了类似的东西,Selda 可能是最接近 Acadia 的一个:https://valderman.github.io/selda/

    尽管他们声称如此,但在许多方面,这与许多语言中的 ORM 平台并没有实质性的不同。

同日更多故事

2026-08-18