Заполнить агрегат root из нескольких баз данных - PullRequest
0 голосов
/ 07 мая 2020

Я новичок в DDD и хотел бы понять, плохая ли практика пытаться заполнить один агрегат root из нескольких баз данных ?

Я пытаюсь разработать систему, в которой все свойства агрегата root заполняются из одной базы данных, кроме name. name находится в другой базе данных и его необходимо заполнить в совокупности root, чтобы его можно было использовать.

TIA

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Я новичок в DDD и хотел бы понять, плохая ли практика - пытаться заполнить один агрегат root из нескольких баз данных?

Да. Счастливый путь не самый дорогой.

Чтение не обязательно является проблемой; если все, что вы делаете, это создание отчета, извлечение данных из нескольких источников - это нормально (хотя мы, конечно, понимаем, что эти источники могут быть «несовместимы» друг с другом.

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

Хорошая новость: если данные уже распределены по двум базам данных, вероятно, у вас есть два агрегата для моделирования, а не один. Совершенно нормально взять такое понятие, как «клиент», и поделиться им между несколькими агрегатами .

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

Выступление Мауро Сервиенти All Our Aggre врата ошибочны может быть полезной отправной точкой.

1 голос
/ 07 мая 2020

Краткий ответ: да, это плохая практика (или даже не практика).

As Martin Fowler выражает:

A DDD aggregate - это кластер объектов домена, который можно рассматривать как единое целое

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

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

Что касается вашей конкретной проблемы c, либо ваш агрегат неверен, либо ваша база данных неверна.

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

Если агрегат верен, переместите свойство Name в ту же базу данных (и, скорее всего, в ту же таблицу), что и остальная часть агрегата. Если по какой-то причине вам нужен Name в этой другой базе данных, чтобы быть доступным для некоторых запросов, поддерживайте его с конечной согласованностью (когда имя изменяется в совокупности, событие publi sh en и подпишитесь на него, чтобы обновить база данных запросов).

...