Текущая нереляционная структура для модели данных такова, что каждый документ представляет транспортное средство
Хорошо, давайте начнем с этого.
В описанной вами модели данных хранение документа уничтожает более раннюю копию.
Теперь представьте, что вместо этого мы хранили документ в репозитории git. Затем сохранение документа также сохранит метаданные, и эти метаданные будут включать указатель на предыдущий документ.
Конечно, у нас, вероятно, много дублирования в этом случае. Поэтому вместо того, чтобы каждый раз сохранять полный документ, мы будем хранить документ патча (представьте себе JSON Patch ) и метаданные, указывающие на исходный патч.
Снова примените ту же идею, но вместо того, чтобы хранить общие документы исправлений, мы используем специфичные для домена сообщения, которые описывают то, что происходит с точки зрения модели.
Вот как выглядит модель данных сущности, полученной из событий: список описаний преобразований документов для конкретного домена.
Когда вам нужно восстановить текущее состояние, вы начинаете с известного вам состояния (которое может быть «нулевым» состоянием документа до того, как с ним что-нибудь случится), и воспроизводите на этом документе все патчи (события), которые произошло с тех пор.
Если вы хотите выполнить временный запрос, игра та же самая, вы воспроизводите события до интересующего вас момента времени.
То есть, когда вы ссылаетесь на старую сборку, вы восстанавливаете документ, используя события, верно?
Да, именно так.
Значит, документ "текущего статуса" все еще существует или это считается плохой практикой?
«Это зависит». В общем случае нет документа о текущем состоянии; только упорядоченный список событий является «реальным», а все остальное происходит из этого.
Беседы об источнике событий часто приводят к рассмотрению выделенных хранилищ сообщений для управления сохранением этих упорядоченных списков, и обычно хранилища сообщений также не поддерживают хранение документов. Поэтому попытка сохранить «текущую версию» требует фиксации в двух разных магазинах.
На этом этапе разработчики обычно либо решают, что «последняя версия» является достаточно хорошей, и в этом случае они создают в конечном итоге согласованные представления документов за пределами границы транзакции ... ИЛИ они решают, что текущая версия важна, и обращаются к хранилищу. решения, поддерживающие сохранение текущей версии в той же транзакции, что и события (например, использование СУБД).
Какая процедура используется для создания снимка, который вы хотите использовать с помощью событий?
Если вы хотите сгенерировать моментальный снимок, то обычно вы используете шаблон, называемый проекцией, для итерации по событиям и fold
или reduce
для создания документа.
Грубо говоря, у вас где-то есть функция, похожая на
document-with-meta-data = projection(event-history-with-metadata)