Aggregate
集約
強い整合性を必ず守りたい Entity のまとまり
データを変更・永続化する最小単位となる
集約には 必ず1つの Aggregate Root が存在する
Aggregate RootはEntityなので、「AggregateはEntityの一種」と捉えることもできる
「良い集約の切り方」はドメイン知識がかなり必要そうmrsekut.icon
図で見るとわかりやすい
https://gyazo.com/b051ffa169a9c1ea2fa2cb35797304c1
集約は、1つ以上のEntityの集合のこと
この赤線のことを集約の境界と呼ぶ
集約には、1つのAggregate Rootが存在する
これのみが集約の外部のEntityらとのやりとりをする
上図では、自動車集約のrootは自動車なので、
外部の顧客などは、タイヤなどにはアクセスできない
集約内の一部が変更されると、Root も変更される
e.g. タイヤの1つが変更されたら、自動車も新しく作られることになる
Root が削除されると、内部の Entity もすべて削除される
集約は 永続性の最小単位である
なぜなら、集約はConsistency (ddd)を担保したい単位であるため。
まとめて取得・まとめて更新 される
これは、DBにおけるtransactionしたい単位と一致する
DBのtransactionでは、単一の集約を扱うべき
複数の集約を含んだり、境界を壊したりすべきでない
DB 操作は集約単位で行う
集約内部の Entity を直接 SQL 等で取得すべきでない
Root から関連を辿って取得する
集約内部の性質
内部 Entity 同士は自由に関連してよい
内部 Entity の Identity は 集約スコープ内で一意 であればよい
集約に含めるべきかどうかの判断
集約は小さく保ちたい
集約に含めないオブジェクトは、idなどの参照で関連すると良い
e.g. Order = {customerId: CustomerId, ... }
ref Aggregateを跨ぐEntityはIDで参照する
↓これやりだすとめちゃくちゃ複雑になる気がする
ルートエンティティは内部のエンティティへの参照を他のオブジェクトに渡せるが、受け取ったオブジェクトは参照を一時的に使用することができるだけで、その参照を保持してはならない。 ref /mrsekut-book-4798121967/168 3つ目の黒丸
集約内部のオブジェクトは、他の集約ルートへの参照を保持することができる。 ref /mrsekut-book-4798121967/168 5つ目の黒丸
参考
/mrsekut-book-4798121967/164 (集約(AGGREGATES)) ~
/mrsekut-book-4048931164/103: 5.8 集約
https://speakerdeck.com/j5ik2o/ji-yue-falseshe-ji-toshi-zhuang
https://zenn.dev/takashi_onawa/articles/4648332c035d97
https://speakerdeck.com/j5ik2o/scaladefalsedomeinmoderingufalseyarikata?slide=16