Append‑only база данных. Как с ней работать?

Korni3 — это утилита для работы с локальной базой данных в режиме только добавление (append‑only). Записи нельзя изменить или удалить. Новые данные только добавляются.

Как идентифицировать объекты?

Записи хранятся в таблицах (создаются автоматически при первом использовании).
У каждой записи обязательно должно быть поле id.

Система автоматически добавляет:

  • zT — временная метка (timestamp);
  • zU — публичный ключ пользователя (автора записи);
  • внутри файлов хранится zS — цифровая подпись, подтверждающая авторство.

Первичный ключ — пара (id, zT).

Если вставить ещё одну запись с тем же id, система создаст новую запись с новой меткой времени.
Один id может иметь несколько версий с разными zT. Это нужно учитывать в прикладном коде (SQL-запросы должны выбирать актуальную версию, например, по максимальному zT).

Как «удалить» запись?

Прямого удаления нет. Вместо этого можно:

  • добавить запись-маркер, что предыдущая версия считается удалённой;
  • или добавить новую пустую версию записи.

Приложение само должно интерпретировать такие маркеры.

Старые версии могут быть удалены с диска в процессе обслуживания (repack), но нет гарантии, что они удалены из копий других пользователей.

Гонки состояний и как их избежать

Основное правило: «менять только свои записи».

Если последняя известная запись по объекту была создана пользователем А, то только А и может вносить изменения (добавлять новую версию). Для большинства объектов информационных систем это естественно:

  • объявление на маркетплейсе меняет только его автор;
  • комментарий — только автор комментария.

Если нужно, чтобы несколько участников могли предлагать изменения, сделайте отдельную таблицу «предложений изменений». Владелец объекта (или его доверенное приложение) может принять эти предложения и добавить новую версию в основную таблицу.

Совместная работа (параграфы документа как в Google Docs)

Если два участника независимо меняют один и тот же объект, возникает конфликт. Korni3 — AP‑система (без распределённых транзакций в стиле ACID). Конфликтующие версии будут обе присутствовать в локальной базе.

Приложение должно:

  • показывать пользователю несколько версий объекта;
  • при необходимости предлагать ручное слияние (как в git);
  • или реализовать логику «последняя запись побеждает» (legal write), если это допустимо.

Рекомендуется хранить изменения как цепочку идемпотентных операций («было/стало») в отдельной таблице. Это упростит разрешение конфликтов.

Цифровые деньги и двойная запись

Вместо классических транзакций можно использовать модель публикации документов:

  1. Один агент публикует документ-обязательство.
  2. Второй агент публикует документ-подтверждение, что он ознакомился и согласен.

Если ваш алгоритм можно переписать в такой логике — он реализуем на Korni3.

Строгие транзакции (ACID) в распределённой среде

Если требуется атомарно изменить несколько объектов на разных «узлах», можно применить технику swarm‑транзакции:

  1. Создаётся документ-журнал со списком операций.
  2. Каждый участник (хранитель реплики) добавляет свою цифровую подпись, подтверждая согласие.
  3. Участник блокирует свой объект на время обработки (не принимает других изменений).
  4. При достижении кворума (например, все участники) документ публикуется.
  5. Участники разблокируют объекты.

Это медленные транзакции (скорость зависит от того, как часто участники синхронизируют свои копии). Однако принципиально такой подход возможен, хотя Korni3 изначально проектировался для локальной и офлайн‑работы.

Важно понять: в таком режиме узлы уже не равноправны (есть выделенные «казначеи» или участники с правом блокировки). Тем не менее, заблокировать работу всей системы по‑прежнему сложно, так как она не привязана к конкретным протоколам связи.


Короткая юридическая справка (дисклеймер)

  • Korni3 — это локальный инструмент, не содержащий сетевых функций.
  • Все вопросы обмена данными между пользователями решаются сторонними средствами (файловые системы, облачные сервисы, флешки и т.д.).
  • Ответственность за выбор средств синхронизации и за содержание передаваемых файлов лежит на самих пользователях.
  • Автор фреймворка не рекомендует использовать синхронизацию с незнакомыми лицами без предварительной юридической консультации.