Poor man's bitemporal data system in SQLite and Clojure
Бюджетная битемпоральная система на SQLite + Clojure
Автор: Адитья Атхалье, 14–15 июля 2025
Цель: «бедняцкая» реализация половины битемпоральной СУБД, удовлетворяющая «десятому закону Хендерсона».
Идея
Смешать SQLite с идеями из бухгалтерии, Clojure, Datomic, XTDB, Rama и Local-First, чтобы хранить факты и время двух видов:
- valid-time — когда событие произошло в реальности.
- tx-time — когда мы это узнали и записали.
Мир фактов и времени
- Сущность = полная история её жизни.
- Факт может быть истинным или ложным; при столкновении фактов нужны правила приоритета.
- Наблюдение ≠ реальность: база фиксирует не саму реальность, а наши заметки о ней.
- Материализованная реальность зависит от того, кто спрашивает и «когда» он спрашивает.
Архитектура
- Две маленькие VM: одна работает, вторая — резерв.
- Дёшевые диски для хранилища временных данных.
- Clojure: пространства имён и неизменяемость как главные инструменты.
- Trade-off: сложно спроектировать, но легко строить, запускать, поддерживать и обучать.
Подход
- Храним каждое изменение как добавление нового факта (append-only).
- Используем SQLite как простой, надёжный движок.
- Через Clojure-обёртку реализуем:
- вставку с двойной временной меткой;
- «time-travel» запросы (
as-of valid-time
,as-of tx-time
).
- Ограничиваемся минимальной сложностью на уровне всей системы.
Итог
Получили «половину» битемпоральной СУБД: медленную, сырую, но дешёвую, понятную и пригодную для локального использования.