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), если это допустимо.
Рекомендуется хранить изменения как цепочку идемпотентных операций («было/стало») в отдельной таблице. Это упростит разрешение конфликтов.
Цифровые деньги и двойная запись
Вместо классических транзакций можно использовать модель публикации документов:
- Один агент публикует документ-обязательство.
- Второй агент публикует документ-подтверждение, что он ознакомился и согласен.
Если ваш алгоритм можно переписать в такой логике — он реализуем на Korni3.
Строгие транзакции (ACID) в распределённой среде
Если требуется атомарно изменить несколько объектов на разных «узлах», можно применить технику swarm‑транзакции:
- Создаётся документ-журнал со списком операций.
- Каждый участник (хранитель реплики) добавляет свою цифровую подпись, подтверждая согласие.
- Участник блокирует свой объект на время обработки (не принимает других изменений).
- При достижении кворума (например, все участники) документ публикуется.
- Участники разблокируют объекты.
Это медленные транзакции (скорость зависит от того, как часто участники синхронизируют свои копии). Однако принципиально такой подход возможен, хотя Korni3 изначально проектировался для локальной и офлайн‑работы.
Важно понять: в таком режиме узлы уже не равноправны (есть выделенные «казначеи» или участники с правом блокировки). Тем не менее, заблокировать работу всей системы по‑прежнему сложно, так как она не привязана к конкретным протоколам связи.
Короткая юридическая справка (дисклеймер)
- Korni3 — это локальный инструмент, не содержащий сетевых функций.
- Все вопросы обмена данными между пользователями решаются сторонними средствами (файловые системы, облачные сервисы, флешки и т.д.).
- Ответственность за выбор средств синхронизации и за содержание передаваемых файлов лежит на самих пользователях.
- Автор фреймворка не рекомендует использовать синхронизацию с незнакомыми лицами без предварительной юридической консультации.