当前位置: 首页 > news >正文

Datomic数据库简介(TBC)

Datomic 数据库详细介绍

Datomic 是一个由 Rich Hickey(Clojure 语言创始人)设计的 不可变、时间感知、分布式数据库,专为现代应用程序设计,强调 数据不变性(immutability)、查询灵活性和可审计性。它结合了 关系数据库的查询能力、文档数据库的灵活性、图数据库的关联能力,同时引入了 时间旅行(time travel)事件溯源(event sourcing) 的概念。


1. Datomic 的核心特性

(1) 不可变数据模型(Immutable Data)

  • 所有数据一旦写入 不可修改,只能追加(append-only)。
  • 任何变更都会生成新的 数据点(datom),保留完整历史记录。
  • 类似于 Git 的版本控制,可以查询任意时间点的数据状态。

(2) 时间感知(Time Travel)

  • 每个数据变更都带有 时间戳(transaction time)
  • 可以查询 过去某个时刻的数据库状态(类似 AS OF 查询)。
  • 适用于 审计、回滚、数据分析 等场景。

(3) 基于 Datalog 的查询语言

  • 使用 Datalog(类似 Prolog 的逻辑查询语言)进行查询。
  • 比 SQL 更灵活,支持递归查询、规则定义等。
  • 示例查询:
    (d/q '[:find ?name:where[?e :user/name ?name][?e :user/age ?age][(> ?age 30)]]db)
    

(4) 分布式架构

  • 分离计算与存储
    • Peer(应用层)负责查询和事务逻辑。
    • Transactor(事务协调器)处理写入。
    • Storage Service(存储后端)可以是 DynamoDB、PostgreSQL、Cassandra 等。
  • 支持 水平扩展(读扩展),但写入由单个 Transactor 处理(类似单写多读)。

(5) Schema-on-Read(读取时模式)

  • 不需要预先定义严格的表结构,可以动态添加属性。
  • 类似于 NoSQL,但支持强类型(:db/valueType 可以是 :string:long:ref 等)。

2. Datomic 的数据模型

Datomic 的数据模型由 Datoms(四元组)构成:

[EntityID, Attribute, Value, TransactionID, Added?]
  • EntityID:唯一标识实体(类似主键)。
  • Attribute:属性(如 :user/name)。
  • Value:属性值(如 "Alice")。
  • TransactionID:事务 ID(时间戳)。
  • Added?true(新增)或 false(删除)。

示例 Datom

[123 :user/name "Alice" 456 true]  ;; 事务 456 添加了用户 123 的名字 "Alice"

3. Datomic 的架构

Datomic 采用 三层架构

  1. Peer(客户端)
    • 运行在应用进程内(如 JVM)。
    • 负责查询、缓存、部分计算。
  2. Transactor(事务处理器)
    • 单点写入(类似 Kafka 的 leader)。
    • 确保 ACID 事务。
  3. Storage Service(存储后端)
    • 可以是 DynamoDB、PostgreSQL、Cassandra 等。
    • 存储 Datoms 和索引。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


4. Datomic 的查询(Datalog)

Datomic 使用 Datalog 查询,比 SQL 更灵活:

基本查询

(d/q '[:find ?name ?age:where[?e :user/name ?name][?e :user/age ?age]]db)

规则(Rules)

(d/q '[:find ?ancestor:in $ % :where(parent ?p ?c)(parent ?ancestor ?p)]db'[[(parent ?a ?b)[?a :person/parent ?b]]])

5. Datomic 的事务

事务通过 Transactor 提交,返回 事务报告(TxReport)

(d/transact conn [{:db/id "temp-id":user/name "Bob":user/age 35}])
  • 每个事务生成一个 TxID(可用于时间查询)。
  • 支持 CAS(Compare-and-Swap) 操作。

6. Datomic 的适用场景

  • 审计与合规(完整历史记录)。
  • 事件溯源(Event Sourcing)(如金融、医疗)。
  • 复杂查询(图查询、递归查询)。
  • 微服务架构(分离读写,避免 ORM)。

7. Datomic 的局限性

  • 写入扩展性:Transactor 是单点(写入吞吐受限)。
  • 成本:商业版较贵(云版按查询收费)。
  • 学习曲线:Datalog 和不可变模型需要适应。

8. Datomic vs. 其他数据库

特性DatomicSQL 数据库MongoDBNeo4j
数据模型不可变 Datoms表+行JSON 文档图(节点+边)
查询语言DatalogSQLMQLCypher
历史查询✅ 支持❌ 有限❌ 有限❌ 有限
扩展性读扩展读写扩展读写扩展读扩展

9. Datomic 的替代方案

  • XTDB(开源,类似 Datomic)。
  • Crux(开源,支持 SQL 和 Datalog)。
  • DuckDB(嵌入式 OLAP,适合分析)。

10. 总结

Datomic 是一个 革命性的数据库,特别适合:

  • 需要完整历史记录的应用(如金融、法律)。
  • 复杂查询场景(图、递归)。
  • Clojure 生态(原生集成)。

但它的 写入扩展性和商业成本 可能限制某些场景。如果需要一个 开源替代品,可以考虑 XTDBCrux

http://www.dtcms.com/a/276740.html

相关文章:

  • Ntfs!LfsFlushLfcb函数分析之Ntfs!_LFCB->LbcbWorkque的背景分析3个restart页面一个普通页面的一个例子
  • 如何在IEEETrans格式的latex标题页插入图像
  • CCS-MSPM0G3507-4-基础篇-串口通讯-实现收和发
  • Java SE--抽象类和接口
  • 面试150 对称二叉树
  • Waiting for server response 和 Content Download
  • 嵌入式程序调试工具
  • 《人件》阅读笔记
  • 【Flask】基础入门
  • 华为业务变革项目IPD基本知识
  • nodejs获取可用cpu数
  • 前端弹性布局全解析
  • 20250712-2-Kubernetes 应用程序生命周期管理-部署应用的流程_笔记
  • PyVision:基于动态工具的具身智能体
  • 剑指offer——队列栈:用两个栈实现队列
  • 模型驱动的架构MDA的案例
  • 如何配置pip使用国内镜像?
  • 2D转换综合写法顺序,以及注意事项
  • 【理念●体系】模板规范篇:打造可标准化复用的 AI 项目骨架
  • 68 指针的减法操作
  • C语言文件读操作详解:使用fgets函数实现安全的按行读取
  • 在YOLO-World中集成DeformConv、CBAM和Cross-Modal Attention模块的技术报告
  • 进制转换算法详解及应用
  • 红旗新能源车:驾驭梦想,驶向未来
  • TDengine 使用最佳实践(1)
  • 系统性能评估方法深度解析:从经典到现代
  • 【C/C++】编译期计算能力概述
  • 《汇编语言:基于X86处理器》第7章 整数运算(3)
  • Noting
  • L1正则化 VS L2正则化