ユーザとタグをエンティティとして実装している
ユーザが集約ルート
ユーザ作成時にタグを付与すると、タグが作成される
テーブルはユーザテーブル、タグテーブル、ユーザとタグの関連管理テーブルの3つがある
といった場合、ユーザ作成処理はユーザリポジトリに、タグ作成処理はタグリポジトリに書くのだと思いますが、ユーザとタグの関連を管理する処理はどこに記載すべきでしょうか
それは集約の設計に依存します。
画像のパターン①は、ユーザ付与タグというオブジェクトはユーザーエンティティの子オブジェクトとして保持し、ユーザーリポジトリにユーザーエンティティのインスタンスごと渡します。
ユーザー付与タグオブジェクトはタグIDを保持します。
https://gyazo.com/dcdb780629e3633105d4a29bb8b7830a
パターン②の場合は、ユーザー付与タグエンティティはユーザーIDとタグIDを保持し、リポジトリもユーザーリポジトリとユーザー付与タグリポジトリに分かれます。
どのようにしてこのパターンどちらにするかを判断するかと言うと、集約の範囲によるメリットデメリットで判断します。
集約を大きくするメリット
→ 整合性を確保する実装とテストが簡単になる
集約を大きくするデメリット
→処理するデータ量が増える
→排他制御の範囲が大きくなる
集約を跨いだ場合の整合性を確保する実装はこちらをご覧ください。
https://little-hands.hatenablog.com/entry/2021/03/08/aggregation