文章摘要
文章探讨了如何在SQLite和Clojure中实现一个简化的双时态数据系统,借鉴了会计学、Datomic、XTDB、Rama等思想,旨在满足Henderson第十定律,即构建一个复杂但非正式、可能存在缺陷的半双时态数据库系统。作者通过这种方式反思当前数据库系统的复杂性,强调即使资源有限,也能进行创新和实验。
文章总结
标题:SQLite 和 Clojure 中的简易双时态数据系统
主要内容:
本文探讨了如何在 SQLite 和 Clojure 中构建一个简易的双时态数据系统,旨在满足 Henderson 第十定律,即“任何足够复杂的数据系统都包含一个临时、非正式、充满漏洞且缓慢的半双时态数据库实现”。作者通过借鉴会计、Clojure、Datomic、XTDB、Rama 和本地优先(Local-first)等思想,设计了一个简易的双时态数据库系统。
核心观点:
双时态数据库的核心:双时态数据库不仅记录数据的状态,还记录数据的变化时间。它通过两个时间维度来管理数据:事件实际发生的时间(有效时间)和记录事件的时间(事务时间)。
会计的启示:会计系统是双时态数据处理的典范。会计系统通过记录每笔交易的完整历史,确保数据的可追溯性和一致性。软件工程师可以从会计系统中借鉴这种处理方式。
数据系统的设计:作者提出了一种基于 SQLite 和 Clojure 的简易双时态数据系统设计。该系统通过以下方式实现双时态数据管理:
- 不可变性:所有数据都是不可变的,新数据通过追加的方式记录,旧数据不会被修改或删除。
- 时间戳:每条记录都包含有效时间和事务时间,确保数据的时态性。
- 视图:通过视图来展示当前的数据状态,视图可以根据时间点重建。
系统架构:作者建议采用垂直集成的 SaaS 架构,尽量减少系统复杂性。通过使用 SQLite 作为数据库引擎,结合 Clojure 的不可变性和命名空间管理,构建一个简单、可扩展且易于维护的系统。
代码实现:文章提供了详细的代码示例,展示了如何在 SQLite 中创建双时态数据表,并通过 Clojure 进行数据操作。代码示例包括如何创建表、插入数据、查询数据等。
未来工作:作者指出,虽然这个简易系统可以满足基本需求,但在生产环境中还需要进行更多的工程优化,例如性能测试、数据迁移、复杂查询处理等。
总结:
本文通过结合 SQLite 和 Clojure,设计了一个简易的双时态数据系统,旨在为独立开发者和小型 SaaS 企业提供一个低成本、易维护的解决方案。虽然这个系统并不完美,但它展示了如何通过简单的工具和技术实现复杂的数据管理需求。
评论总结
Clojure与双时态性的潜力
- 观点:Clojure社区对双时态性的关注不足,尽管这一概念在实际应用中非常有用。
- 论据:moomin指出,许多场景需要查询历史数据,但很少有数据库设计支持这种查询。
- 引用:"It's a pity that Clojure is kind of a hermetic space these days, because the concept of bitemporality really deserves much more attention."
- 引用:"It's amazing how often you want to know 'What was the P&L for March using the data available on Apr 4?' and how uncommon it is to find a database design that supports that kind of query."
双时态性查询的优化挑战
- 观点:双时态性查询的实现可能面临性能优化问题。
- 论据:refset展示了一个复杂的SQL视图,并指出查询优化器可能难以处理这种视图。
- 引用:"...cool approach, but poor query optimizer!"
- 引用:"It would be interesting to see what Turso's (SQLite fork) recent DBSP-based Incremental View Maintenance capability would make of a view like this."
双时态性系统的实际应用与挑战
- 观点:双时态性系统在实际应用中表现良好,但数据质量和历史记录的复杂性是主要挑战。
- 论据:whalesalad分享了在PostgreSQL上构建双时态性系统的经验,指出数据错误和模式演变带来的问题。
- 引用:"The big challenge and core issue we discovered though is that our data sucks."
- 引用:"Suffice to say if I were to do things over again, I would implement a much better change tracking system."
对双时态性的质疑
- 观点:双时态性在某些领域并不适用或缺乏吸引力。
- 论据:thom表示,基于其工作领域,双时态性并不有趣。
- 引用:"Perhaps because of the domains I work in I continue to find bitemporality completely uninteresting."
- 引用:"Stop trying to make fetch-as-of happen."
总结:评论中既有对双时态性潜力的认可,也有对其实现复杂性和适用性的质疑。Clojure社区被认为应更多关注这一领域,但实际应用中数据质量和查询优化仍是主要挑战。