对象里嵌对象,对象里套集合,偶尔还来点循环引用——这种代码写起来顺手,存起来头疼。
作者 Nicolai 喜欢丰富的领域模型。在 TypeScript 里,根对象挂领域数据,引用传来传去,程序结构和问题结构天然对齐。然后持久化登场,开始默默拆家具:表、连接表、映射代码、DTO、重新水合逻辑、ORM 里那些周四下午突然看不懂的行为。
打开网易新闻 查看精彩图片
他不讨厌 Postgres,甚至挺喜欢。但应用状态想长成对象图,持久化模型想要另一套东西,翻译层成了项目里的项目。
于是他开始做 GraphVault。
灵感来自 EclipseStore。核心想法很直接:持久化对象图本身,让应用保持自然形态,把图当作首要数据结构,而非先强行塞进另一套模型。一个普通的工单系统,表面看是列表,细看全是关联:阻塞关系、重复标记、相关事件、史诗、客户上下文、工作流历史、审计事件、"为什么改了"的链条。表能存这些事实,但你真正推理的领域是它们之间的网络。
GraphVault 是给 TypeScript 和 NestJS 的嵌入式对象图持久化。从根对象开始,改普通 TypeScript 对象,想持久化时显式提交。代码示例里,storage.root.documents.push 一个新文档,然后 await storage.storeRoot()。
图里可以有共享引用、循环、类、Map、Set、Date、Buffer、bigint、类型化数组。对象身份被保留,两个指向同一对象的引用,重载后仍指向同一对象。
这是第一个里程碑:存下图,完整取回。
然后需求单越拉越长。GraphVault 现在有了事务与回滚、乐观锁与悲观锁、WAL 恢复、共享存储的围栏令牌、持久化索引、模式
热门跟贴