集約は小さく保つ
ルール
集約には、同一トランザクション内で整合性を保たなければならないものだけを含める。「関連があるから」「便利だから」という理由で集約に含めてはならない。
他の集約への参照は、オブジェクト参照ではなくIDのみで持つ。
❌ 大きすぎる集約
Order {
customer: Customer // Customer集約をオブジェクト参照で保持
items: OrderLine[]
payment: Payment // Payment集約を内包
shipment: Shipment // Shipment集約を内包
}
✅ 小さい集約
Order {
customerId: CustomerId // IDのみ
items: OrderLine[] // 明細はOrderと同じ整合性単位
paymentId: PaymentId // IDのみ
}
理由
大きな集約は:
- ロード時間が長くなる(関連するすべてを読み込む)
- 楽観的ロックの競合が増える(一箇所の変更で集約全体がロックされる)
- 不必要なデータが変更されるリスクが高まる
集約を小さく保つことで、複数のユーザーが同時に操作しても競合が起きにくく、パフォーマンスが改善する。集約をまたがる整合性はドメインイベントで結果整合性を使って実現する。
例外
- UI上で「アトミックに表示・編集される」単位は集約として大きくてもよい
- ビジネスルールが複数オブジェクト間の不変条件を要求する場合(例:注文と明細の合計金額一致)
関連概念
出典
実践ドメイン駆動設計(Vaughn Vernon)第10章