DDD / агрегированный корень / управление версиями

Как мы обычно работаем с версией совокупного корня?

Я думал в этом направлении (я занимаюсь дизайном опросов).

Один из способов управления версиями - наличие явного метода создания новой версии на основе существующей. Например, Study (совокупный корень).

Итак, изначально у нас есть совокупный корень, корневым объектом которого является Исследование с (бизнес-ключом) "ABC", версия "1".

При вызове метода newVersion () в исследовании будет создана копия этого исследования и всех других сущностей, принадлежащих одному и тому же агрегированному корню.

Таким образом, управление версиями осуществляется путем создания отдельного экземпляра (совокупного корня). ID составной (бизнес-ключ + версия).

Как мы узнаем, что это ветка? или это только одна версия? (1.1? Или 2). Думаю, сработало бы это простое правило: если больше нет связанной версии, то это «на одну версию выше» (2); если уже есть другая версия, то это ветка (1.1).

Еще одна проблема: шум.

Но это означает, что мы не можем работать / изменять существующую версию. Нам придется создавать newVersion каждый раз, когда мы хотим внести изменения в наш объект. Каждый раз??? Хммм .... Звучит неправильно.

Или ... мы можем создать подобное правило на основе флага (активно / неактивно или опубликовано / не опубликовано). Если флаг «неактивен», мы можем изменить AR напрямую, не создавая новую версию. Если флаг активен, мы должны либо: (а) сначала установить его как «неактивный» и изменить .... или (б) создать новую версию и работать над версией (изначально установленной как «неактивно») ).

Есть какие-нибудь мысли / опыт, которыми вы хотите поделиться по этому поводу?


person Cokorda Raka    schedule 07.03.2017    source источник
comment
Или мы можем просто отказаться от числовой версии, просто предоставив пользователю возможность выбрать название версии. Скорость изменения в любом случае невелика, поэтому мы можем по умолчанию использовать строку даты, ГГГГММДД. Проверка уникальности может быть выполнена путем обхода (переход назад и вперед от текущего AR к предыдущей и следующей версиям) и посмотреть, использовалось ли имя версии. Это больше похоже на теги, чем на управление версиями.   -  person Cokorda Raka    schedule 07.03.2017
comment
Если вы рассмотрите возможность использования источника событий, вы получите запись всех изменений и, вероятно, у вас не будет явного управления версиями.   -  person Alexey Zimarev    schedule 08.03.2017
comment
@cokordaraka Не могли бы вы подробнее рассказать о концепции управления версиями? Вы занимаетесь моделированием или хотите что-то добавить к концепции тактического блока DDD, а именно агрегат. Это не понятно . Для чего нужна версия?   -  person Sergiy Chernets    schedule 09.03.2017
comment
Привет, Сергей: stackoverflow.com/questions/42653188 /   -  person Cokorda Raka    schedule 11.03.2017


Ответы (1)


Я думаю, что при исследовании этого вопроса вы обнаружите, что это немного сбивает с толку, потому что здесь задействованы две очень разные концепции:

  • Управление версиями как механизм управления параллелизмом для поддержки оптимистичного параллелизма
  • Управление версиями как явная концепция предметной области

Управление версиями для поддержки оптимистичного параллелизма

Оптимистический параллелизм - это когда двум одновременным транзакциям разрешено запускаться, но если они обе пытаются изменить один и тот же элемент данных, только первая из них может продолжить. См. Управление параллелизмом для обзора различных стратегий блокировки.

Таким образом, вы оставляете управление версиями на усмотрение технологии сохраняемости, потому что цель версии - обнаруживать одновременные записи на уровень сохраняемости.

При использовании этого шаблона часто даже не хранятся копии старых версий, однако, безусловно, можно сделать это в качестве контрольного журнала / журнала изменений.

Управление версиями как явная концепция предметной области

Исходя из вашего вопроса и необходимости поддержки потенциальных стратегий ветвления, похоже, что управление версиями является явной концепцией предметной области в вашем домене, т. Е. Концепция «Версия» - это то, о чем говорят ваши эксперты в предметной области, а работа с версиями - это важная часть вездесущего языка.

Однако вы поднимаете несколько различных концепций, которые указывают на то, что домен требует дальнейшего изучения:

  • Ветвление версий
  • Пользовательские имена / теги версий (но все еще связаны с «цепочкой» версий)
  • Explicit version changes (user requested) vs implicit version changes (automatic on every change)
    • If I understand your intent correctly, with explicit versioning, the current 'active'/'live'/'tip' version is mutable and can be modified without tracking the change, until the user 'commits' it - it becomes immutable, and a new 'live' version that is mutable is created.

Некоторые другие концепции, которые могут возникнуть, если вы изучите эту версию:

  • Слияние веток (что произойдет, если вы разделите две ветки, если вы захотите снова объединить их?)
  • Откат - если у вас старая версия, поддерживаете ли вы «отмену» одного или нескольких изменений?

Учитывая вышеизложенное, вы также можете получить некоторое представление о том, как системы контроля версий работают как централизованно (например, subversion ) и распространены (например, git и mercurial), поскольку они представляют активную рабочую модель отслеживания версий со смесью изменяемых и неизменяемых элементов.

Открытые вопросы здесь предполагают, что вам необходимо изучить это более подробно с экспертами в вашей предметной области. С DDD иногда легко потеряться в том, что вы можете сделать, но я настоятельно рекомендую вам попытаться понять, что вам нужно делать.

Как ваши пользователи / эксперты в предметной области думают о мире? Какие операции они хотят выполнять? Какова цель этих операций по отношению к их первоначальной цели? Ваша цель - сформулировать ответы на эти вопросы в модели, которая эффективно инкапсулирует процессы, с которыми они работают.

Отредактируйте, чтобы учесть моделирование

Основываясь на вашем комментарии, моим первым ответом было бы оспаривать толкование слова «версия», когда я думаю о модифицированном вопроснике. Фактически, у меня возникнет соблазн бросить вызов моделированию отношений шаблон / опрос. Рассмотрим возможный набор сущностей:

  • Шаблон

    • Defines the set of questions in the questionnaire
    • Supports operations:
      • StartSurvey
      • Различные операции по изменению вопросов и параметров в шаблоне и т. Д.
  • Опрос

    • Rather than referencing a 'live' template, the survey would own it's own questionnaire
    • Когда вы вызываете Template.StartSurvey, он возвращает опрос, который предварительно заполнен списком вопросов из шаблона.
    • Опрос также поддерживает изменение вопросов, но это не меняет шаблон, из которого он был создан.
    • В отличие от шаблона, опрос также поддерживает список записанных ответов и предлагает операции для установки ответов.
    • Вероятно, он также включает в себя состояние жизненного цикла, в котором в некоторых состояниях разрешается отвечать на вопросы, но после «отправки» вы не можете изменять ответы (просто догадываясь об этом).

В этом мире опрос «вытеснен» из шаблона, но затем живет самостоятельной жизнью. Вы можете изменять анкету в опросе по своему усмотрению, и это не повлияет на шаблон.

Компромисс здесь заключается в том, что если вы измените шаблон, ни один из опросов, которые уже были созданы на его основе, не будет обновлен - но похоже, что это может быть безопаснее для вас в любом случае?

Вы также можете поддерживать операции по преобразованию опроса обратно в шаблон, чтобы, если вам нравится вид измененного опроса, вы могли бы «шаблонизировать» его, чтобы его можно было использовать для будущих опросов.

person Chris Simon    schedule 09.03.2017
comment
Привет, Крис, спасибо за исчерпывающий ответ. Управление версиями в моем случае больше связано с концепцией предметной области (я считаю). Это происходит из ситуаций, когда в середине опроса разрешается обновить анкету (другая версия). Этого не должно происходить в идеальной ситуации, но это случается. Теперь опрос основан на шаблоне (поэтому вы не хотите, чтобы это решение о переключении на другую версию вопросника в одном опросе влияло на другие опросы, основанные на том же шаблоне). Я все еще ломаю голову, чтобы придумать подходящую модель в свете новых знаний о методах отбора проб. - person Cokorda Raka; 09.03.2017
comment
Обновленный ответ для рассмотрения некоторых сценариев моделирования, которые могут помочь. - person Chris Simon; 11.03.2017
comment
Привет, Крис, спасибо за ответ. Я тоже думал в этом направлении. Думаю, в этом дивном новом мире микросервисов нам действительно не следует беспокоиться о копировании материалов. Что касается измененного шаблона, возможно, с помощью ES, мы можем разработать механизм для обновления невыполненного опроса / опроса, ожидающего в очереди на уведомление, и обновить его копию (полностью заменить). - person Cokorda Raka; 11.03.2017