Прежде всего, я согласен с Eben: не используйте ссылки на объекты одного агрегата внутри другого, используйте вместо него объект-значение, просто содержащий идентификатор других агрегатов. И в базе данных этот идентификатор представляет собой просто строку или целое число (или то, что вы используете в качестве типа идентификатора в базе данных) вместо внешнего ключа.
И всегда спрашивайте себя, какие данные другого агрегата вы действительно используете? нужно и для каких операций вашего нового агрегата вам вообще нужны данные какого типа?
В большинстве случаев получается просто передать требуемые данные, собранные из первого агрегата, в метод, вызываемый для нового агрегата. достаточно.
Если это даже происходит в одном и том же ограниченном контексте, я склонен быть прагматичным c по этому поводу. Я собираю агрегат, из которого мне нужны данные, через его репозиторий, а затем передаю его в качестве параметра методу нового агрегата. Или только какая-то его часть. Я обычно делаю это внутри службы приложений.
Таким образом, вам не нужно хранить какую-либо другую информацию о старом агрегате в новом, а не его идентификатор, но у вас всегда есть актуальное состояние старый агрегат, где вам это нужно. Эта концепция даже не относится к проектированию, основанному на предметной области, но в целом рекомендуется использовать только те зависимости, которые вам действительно нужны.
А если вы не хотите полагаться на структуру старого агрегата, просто создайте несколько вид нового объекта значения, который вы заполняете данными старого агрегата на прикладном уровне. Поэтому вам даже не нужно собирать данные из старого хранилища агрегатов, а просто есть какой-то сервис, который только считывает необходимые данные из хранилища напрямую. Но я бы порекомендовал это, только если проблема заключается в производительности ...
И еще один последний комментарий об использовании внешних ключей в базах данных в монолитных c приложениях:
Не используйте иностранные ключи, если вы ссылаетесь на что-то из другого ограниченного контекста, если вы когда-нибудь планируете разделить мононлит в какой-то момент. Вместо этого используйте логические ссылки, которые вы рассматриваете как некий удаленный идентификатор, и разрешите их на прикладном уровне. В противном случае разделение базы данных для различных служб, которые вы хотите извлечь из mononlith, может стать кошмаром.