ClickHouse не тормозит, но не умеет в DML. Часть 2. Append-only

Append-only — целебная пилюля для ClickHouse, без которой он скорее обуза, нежели буст для бизнеса. Разберем что это, и как этим пользоваться.

https://habr.com/ru/articles/1036162/

#clickhouse #append_only #версионирование_данных #sql #mergetree

ClickHouse не тормозит, но не умеет в DML. Часть 2. Append-only

Append-only — целебная пилюля для ClickHouse. Разберем что это, и как этим пользоваться. Напоминаю, что ClickHouse очень плохо умеет в DML — рекомендую к прочтению  первую статью . Ну а решение...

Хабр

Poor man's bitemporal data system in SQLite and Clojure | Hacker News

LinkPoor man's bitemporal data system in SQLite and Clojure
https://news.ycombinator.com/item?id=37705376

📌 Summary:
本文以作者個人開發經驗為背景,深入剖析使用 SQLite 與 Clojure 建立一套「窮人的雙時態(bitemporal)」資料庫系統。文章首重說明雙時態資料系統如何記錄「事實發生時間(valid time)」與「記錄交易時間(transaction time)」,且所有資料皆不可更改,只能附加新事實,確保完整的歷史追蹤與溯源能力。作者舉例以零售業結帳糾紛更正帳單過程,形象說明雙時態資料庫如何對於任何時刻的狀態進行查詢與還原。文中亦比較其他專業時態資料庫,如 Datomic、XTDB、Rama,並強調自己方案以 SQLite 為底、簡約且免除複雜分散式問題,契合獨立軟體開發者低成本架構。全文深入探討資料庫設計哲學,包括不可變性、冪等性、時間解析度、命名空間與使用者驗證等技術細節,以及如何利用 Clojure 的功能如 Specter API 實現查詢與視圖生成。文章底層核心理念是複雜性不可避免,透過垂直整合且可理解的單機架構,達成易於維護與擴充的獨立 SaaS 系統,並強調資料主權、在地化合規與系統可完全復原的重要性。

🎯 Key Points:
→ 【雙時態基礎概念】
★ 雙時態資料庫記錄兩種時間屬性:事件真實發生時間(valid time)與資料記錄時間(transaction time)。
★ 不修改舊紀錄,透過新增反向操作(如撤銷交易)及修正交易,保留完整時間序列。
★ 以 Entity-Attribute-Value (EAV) 與「assertion」方式,清楚表達某事實為真或假,支援多版本事實並透過「valid_preferred」欄位決定優先事實。

→ 【技術實作細節】
★ 建立嚴格命名空間規則管理 namespaces、users、entities,確保資料唯一與安全。
★ 利用 SQLite 的 WAL 模式實現單序列寫入、多讀者非阻塞架構,模擬 Datomic 單機版效能。
★ 使用 Honey SQL 以 Clojure 程式碼生成 SQL,增強 SQL 可組合性與維護性。
★ 視圖(views)用 Clojure 應用程式端實作(如 Specter API),避免 SQL 複雜查詢與索引失效問題,並用 FTS5 支援全文檢索。
★ 不支援寫入併發,以簡化系統,採用 Append-only(不可變)與冪等操作設計。

→ 【架構與營運策略】
★ 垂直整合架構-單臺伺服器包含應用、資料庫、快取等,便於部署與維護。
★ 採單租戶資料庫設計以因應合規且方便水平擴展。
★ 採用 UUIDv7 兼顧時間順序與全域唯一,作為交易 ID,便利版本管理與衝突解決。
★ 強調系統簡潔、易於理解,適合獨立開發者與小型 SaaS,避免雲端廠商鎖頭與過度複雜技術負擔。
★ 支持資料隨需匯出,確保資料主權與符合資料保護法規。

🔖 Keywords:
#雙時態資料庫 #SQLite #Clojure #Entity_Attribute_Value #垂直整合
#bitemporal_database #append_only #immutability #transaction_time #valid_time

Poor man's bitemporal data system in SQLite and Clojure | Hacker News