Hacker News Digest

03 сентября 2025 г. в 17:47 • evalapply.org • ⭐ 149 • 💬 39

OriginalHN

#clojure#sqlite#bitemporal#datomic#xtdb#append-only#time-travel#postgresql#tstzrange#eav-model

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: сложно спроектировать, но легко строить, запускать, поддерживать и обучать.

Подход

  1. Храним каждое изменение как добавление нового факта (append-only).
  2. Используем SQLite как простой, надёжный движок.
  3. Через Clojure-обёртку реализуем:
    • вставку с двойной временной меткой;
    • «time-travel» запросы (as-of valid-time, as-of tx-time).
  4. Ограничиваемся минимальной сложностью на уровне всей системы.

Итог

Получили «половину» битемпоральной СУБД: медленную, сырую, но дешёвую, понятную и пригодную для локального использования.