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
英文地址,請注明出處:http://en.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垃圾回收…