Мне кажется, что User должен быть корневым агрегатом в большинстве систем, где пользователь взаимодействует с системой.
Будет ли это справедливой оценкой?
Наверное, нет. Это нормально для наших систем документировать отношения между агрегатами.
Более вероятными кандидатами на корень агрегата являются
Отчасти смысл агрегатов заключается в том, что нам не нужен каждый клочок информации в нашей базе данных при внесении изменений; нам нужно только то, что нам нужно, и поэтому нам нужны только те доменные сущности, которые управляют информацией, которая нам нужна, а корень агрегата будет той доменной сущностью, которую мы решили использовать в качестве точки входа для связи с остальными.
Я склонен думать об этом в терминах блокировок: когда мы пытаемся вычислить влияние некоторой новой информации на нашу модель домена, нам нужно заблокировать некоторую существующую информацию от одновременного изменения. Совокупность, по сути, представляет собой набор блокировок, которые нам нужно иметь, чтобы безопасно внести изменения.
Существует определенное напряжение: если у нас отсутствует блокировка, которую мы должны держать, то одновременное изменение данных может нас испортить. Если мы удерживаем ненужную нам блокировку, то мы блокируем другие изменения в системе, замедляя работу всей системы.
Моделирование - это в основном выяснение того, где нам нужны блокировки, и понимание того, где мы можем использовать незаблокированные данные вместо заблокированных.
В этом случае возникает вопрос: не нужно ли нам блокировать клиента для большинства изменений? Может быть, в некоторых областях, но как общее правило? Нет, не нужно.
Примечание: с тех пор как Эванс впервые представил паттерн AGGREGATE в своей книге, возникло некоторое количество споров о том, что лучше понимать под агрегатами - границы согласованности или границы транзакций. Различие примерно переводится как "может ли одна транзакция охватывать несколько агрегатов"?
Поэтому будьте внимательны, как в своих собственных размышлениях, так и при ознакомлении с мнениями других, чтобы убедиться, что вы понимаете, какая перспектива наиболее соответствует точке зрения.