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 采用 三层架构:
- Peer(客户端):
- 运行在应用进程内(如 JVM)。
- 负责查询、缓存、部分计算。
- Transactor(事务处理器):
- 单点写入(类似 Kafka 的 leader)。
- 确保 ACID 事务。
- 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. 其他数据库
特性 | Datomic | SQL 数据库 | MongoDB | Neo4j |
---|---|---|---|---|
数据模型 | 不可变 Datoms | 表+行 | JSON 文档 | 图(节点+边) |
查询语言 | Datalog | SQL | MQL | Cypher |
历史查询 | ✅ 支持 | ❌ 有限 | ❌ 有限 | ❌ 有限 |
扩展性 | 读扩展 | 读写扩展 | 读写扩展 | 读扩展 |
9. Datomic 的替代方案
- XTDB(开源,类似 Datomic)。
- Crux(开源,支持 SQL 和 Datalog)。
- DuckDB(嵌入式 OLAP,适合分析)。
10. 总结
Datomic 是一个 革命性的数据库,特别适合:
- 需要完整历史记录的应用(如金融、法律)。
- 复杂查询场景(图、递归)。
- Clojure 生态(原生集成)。
但它的 写入扩展性和商业成本 可能限制某些场景。如果需要一个 开源替代品,可以考虑 XTDB 或 Crux。