Datomic 是一个了不起的数据库,我强烈推荐它。它具有许多与其他数据库系统不同的特性:
- 和 Clojure 的数据结构一样,它是持久化的,这意味着默认情况下,向数据库添加新事实不会删除旧事实,允许您查询数据库在之前时间点的状态,增强审计能力和辅助调试.
- 底层实体属性值(EAV/三元组)数据模型(至少部分受到 RDF 和语义网的启发)非常灵活,允许您表达任意图形结构并轻松处理多态性。
- 查询语言是 Datalog 的风格,是一种基于模式匹配的查询语言,比 SQL 等更具表现力,因为它可以进行递归查询,使其特别适合处理图形数据/查询。
- 除了 Datalog 查询之外,还有一个
pull
api,它让您可以更简单地使用类似 GraphQL 的表达式从数据库中提取数据,该表达式指定您希望从数据库中提取的类文档结构的形状。这些查询甚至可以在:find
Datalog 查询的子句中使用。
- 您可以在查询中使用 Clojure 函数。
- 索引系统非常智能并且或多或少是自动的,这与通常用于调整 SQL 数据库以提高性能的工作形成鲜明对比。
- 事务通过与查询不同的 API/函数调用,这意味着 OWASP(SQL 注入)确定的第一大安全风险在 Datomic 中实际上是不可能的。
- Transactor/read-replica 设计使得扩展读取/查询变得超级容易,同时保持对 transactor 的压力。
- 这很有趣。
这里值得指出的一件事是,通过采用 EAV 数据模型和数据记录/拉取查询,Datomic 最终具有更接近 NoSQL 数据库的结构灵活性,同时仍然从根本上是关系的,并且在它的关系查询中更具表现力比 SQL。
这太棒了,你绝对应该试一试。它会让你的大脑融化一点。以好的方式。
还值得注意的是,它的受欢迎程度激发了许多成功的开源项目,因此底层方法不会很快出现在任何地方:
- DataScript:在内存中 clj/cljs 部分实现
- Datahike:DataScript 的分支,它在磁盘索引上进行查询,这意味着您不必将所有内容都保存在内存中进行查询
- Mentat:Mozilla 项目试图为 Mozilla 项目制作 Datomic-alike