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.pswp.cn/diannao/90837.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xformers 完整安装教程【pip conda】(解决 conda 版本 pytorch 自适应安装 xformers)

我个人喜欢用 mamba(conda)创建环境,然后用 mamba 安装 pytorch CUDA(如果需要使用 CUDA 编译),还有一些比如 gcc/g 等与 python 无关的一些工具。 但是最近我在扩充环境的时候,发现需要额外安…

VM虚拟机全版本网盘+免费本地网络穿透端口映射实时同步动态家庭IP教程

VM虚拟机全版本秘钥,文章末尾。 首先网络穿透的意义是让公网可以直接访问家庭电脑,这样本地电脑的硬件性能得以完全发挥,特别是在云服务器贵性能又没家庭电脑好,专线宽带又贵,第三方网络穿透贵的场景下。一般第三方网…

C++ - 仿 RabbitMQ 实现消息队列--项目介绍与环境搭建

目录 项目介绍 开发环境 技术选型 环境搭建 安装 wget(一般情况下默认会自带) 更换国内软件源 安装 lrzsz 传输工具 安装编译器 安装项目构建工具 make 安装调试器 安装 git 安装 cmake 安装 Protobuf 安装 Muduo 安装 SQLite3 安装 Gtest 项目介绍 首先说一下…

《目标检测模块实践手册:从原理到落地的尝试与分享》第一期

大家好,欢迎来到《目标检测模块实践手册》系列的第一篇。从今天开始,我想以一种 “实践记录者” 的身份,和大家聊聊在目标检测任务中那些形形色色的模块。这些内容没有权威结论,更多的是我在实际操作中的一些尝试、发现和踩过的坑…

C++11笑传之引用

C11前言列表初始化{}进行初始化initializer_list右值引用和移动语义左值与右值左值引用与右值引用引用延长生命周期右值引用和移动语义的使用场景左值引用移动构造和移动赋值右值引用在容器插入的提效引用折叠万能折叠完美转发前言 C11是C继98后的更新,其更新了许多…

瀚高数据库提交数据后,是否需要COMMIT(APP)

文章目录环境症状问题原因解决方案报错编码环境 系统平台: 版本:5.6.5,4.5 症状 瀚高数据库提交数据后,是否需要commit,瀚高数据库是否有配置项。 问题原因 瀚高数据库默认自动COMMIT(提交数据)&#…

深大计算机游戏开发实验三

主要步骤主角飞船的创建和移动边界设置以及护盾设置创建敌机自动生成敌机图层设置弹丸设置武器创建不同发射模式管理竞态条件击败敌机掉落升级道具不同敌机的生成分值显示实现退出游戏界面之后进入游戏的最高记录重置游戏界面失败后重新加载最记录不会重置任何时候在游戏界面按…

详解缓存淘汰策略:LRU

文章目录缓存淘汰策略LRU核心结构核心操作流程局限性源码走读AddGet缓存淘汰策略 缓存淘汰策略的存在是为了解决 缓存容量有限性 和 高缓存命中率 之间的矛盾。其核心目标是在有限的缓存空间内,尽可能提高缓存命中率 缓存容量有限性:缓存(例…

什么是 Bootloader?怎么把它移植到 STM32 上?

一、Bootloader 是啥?它都干了些啥?想象一下你的 MCU(比如 STM32)是一个小机器人,上电之后第一件事,它不会立马开始“干正事”(运行你的主程序),而是先去运行一个“开场引…

无人机避障——感知篇(Ego_Planner_v2中的滚动窗口实现动态实时感知建图grid_map ROS节点理解与参数调整影响)

处理器:Orin nx 双目视觉传感器:ZED2 实时感知建图方法:Vins Fusion Raycast (VIO与射线投影法感知定位加建图方法) 项目地址:https://github.com/ZJU-FAST-Lab/EGO-Planner-v2 【注意】:建…

26-计组-寻址方式

指令寻址与PC自增一、指令寻址方式定义:寻找下一条将要执行的指令地址的过程。 核心部件:程序计数器(PC),用于指示待执行指令的地址。 执行流程:CPU根据PC值从主存取指令。取指后,PC自动自增&am…

生成式对抗网络(GAN)模型原理概述

生成对抗网络(Generative Adversarial Network, GAN)是一种通过对抗训练生成数据的深度学习模型,由生成器(Generator)和判别器(Discriminator)两部分组成,其核心思想源于博弈论中的零…

Vue和Element的使用

文章目录1.vue 脚手架创建步骤2.vue项目开发流程3.vue路由4.Element1.vue 脚手架创建步骤 创建一个文件夹 vue双击进入文件夹,在路径上输入cmd输入vue ui, 目的:调出图形化用户界面点击创建 9. 10.在vscode中打开 主要目录介绍 src目录介绍 vue项目启动 图形化界面中没有npm…

如何设置直播间的观看门槛,让直播间安全有效地运行?

文章目录前言一、直播间观看门槛有哪几种形式?二、设置直播间的观看门槛,对直播的好处是什么三、如何一站式实现上述功能?总结前言 打造一个安全、高效、互动良好的直播间并非易事。面对海量涌入的观众,如何有效识别并阻挡潜在的…

【SkyWalking】配置告警规则并通过 Webhook 推送钉钉通知

🧭 本文为 【SkyWalking 系列】第 3 篇 👉 系列导航:点击跳转 【SkyWalking】配置告警规则并通过 Webhook 推送钉钉通知 简介 介绍 SkyWalking 告警机制、告警规则格式以及如何通过 webhook 方式将告警信息发送到钉钉。 引入 服务响应超时…

关于 验证码系统 详解

验证码系统的目的是:阻止自动化脚本访问网页资源,验证访问者是否为真实人类用户。它通过各种测试(图像、行为、计算等)判断请求是否来自机器人。一、验证码系统的整体架构验证码系统通常由 客户端 服务端 风控模型 数据采集 四…

微服务集成snail-job分布式定时任务系统实践

前言 从事开发工作的同学,应该对定时任务的概念并不陌生,就是我们的系统在运行过程中能够自动执行的一些任务、工作流程,无需人工干预。常见的使用场景包括:数据库的定时备份、文件系统的定时上传云端服务、每天早上的业务报表数…

依赖注入的逻辑基于Java语言

对于一个厨师,要做一道菜。传统的做法是:你需要什么食材,就自己去菜市场买什么。这意味着你必须知道去哪个菜市场、怎么挑选食材、怎么讨价还价等等。你不仅要会做菜,还要会买菜,职责变得复杂了。 而依赖注入就像是有一…

skywalking镜像应用springboot的例子

目录 1、skywalking-ui连接skywalking-oap服务失败问题 2、k8s环境 检查skywalking-oap服务状态 3、本地iidea启动服务连接skywalking oap服务 4、基于apache-skywalking-java-agent-9.4.0.tgz构建skywalking-agent镜像 4.1、Dockerfile内容如下 4.2、AbstractBuilder.M…

3. java 堆和 JVM 内存结构

1. JVM介绍和运行流程-CSDN博客 2. 什么是程序计数器-CSDN博客 3. java 堆和 JVM 内存结构-CSDN博客 4. 虚拟机栈-CSDN博客 5. JVM 的方法区-CSDN博客 6. JVM直接内存-CSDN博客 7. JVM类加载器与双亲委派模型-CSDN博客 8. JVM类装载的执行过程-CSDN博客 9. JVM垃圾回收…