Ваш документ - это модель записи, совокупность в мире дизайна, управляемого доменом. Будучи CQRS без источника событий, вам необходимо сохранить состояние документа вместе с генерируемыми событиями. Вам также необходимо защитить от одновременной записи. При этом у вас есть два варианта:
У этого есть преимущество, которое быстро и вероятность одновременных изменений модификации ниже, если у вас есть отдельная защита для каждого раздела документа на месте (то есть атрибут version
для каждого в качестве противопоставления к одному version
для всего документа).
Недостаток заключается в том, что он слишком много сочетает модель (класс) Домена с инфраструктурой, поскольку вам нужно поставить запросы внутри класса Document. Если вы смешаете Домен с Инфраструктурой, то у вас больше нет чистой модели, и вы потеряете возможность безопасно повторить команду. Это может быть сделано за пределами класса Domain, в инфраструктуре, если вы «научите» репозиторий инфраструктуры реагировать по-разному на основе испущенных событий.
Это также указание на то, что у вас на самом деле несколько моделей записи , каждая модель для разделов документа (заголовок, тело, нижний колонтитул, заметки и т. д.), поскольку модель записи продиктована границей согласованности. В этом случае они будут использовать один и тот же идентификатор документа.
Он имеет огромное преимущество в том, что вы можете иметь чистый класс домена, без какой-либо зависимости от инфраструктуры. Инфраструктура просто берет все состояние и заменяет сохраняющееся состояние и добавляет новые события в одну и ту же транзакцию.
У этого недостатка это медленнее, чем первое решение. Это курс, если вы будете следовать подходу DDD после определения документа как совокупности (в DDD агрегат полностью загружен и полностью сохраняется в ответ на выполнение команд).
Я думаю, что проблема заключается в огромных утверждениях, которые должны быть проанализированы, скомпилированы и спланированы.
Лучше использовать пакеты параметров в качестве входных данных и позволить cypher выполнить итерацию, см.
Для чего вам нужны все UUID?
есть индексы и ограничения, установленные для ваших операций MERGE?