Entityの正規化の基準はAggregateを意識する
例えば、OrderとCustomerの2つのEntityの関係性を考える
正規化するかどうかで、2通りの定義を考えられる
code:正規化しない.ts
type Order = {
id: OrderId
customer: Customer
items: OrderItem[]
}
code:正規化する.ts
type Order = {
id: OrderId
customerId: CustomerId // idのみを知っている
items: OrderItem[]
}
望ましい設計はどちらか?
Aggregateを意識する
OrderとCustomerが同一のAggregateであるなら、前者
そうでないなら、後者
抑えるべきは、
Entityはimmutableである
Aggregateは、最小の更新単位である
Aggregateは、最小の永続単位である
上記の例で言えば、以下のようなことを考えれて判断すれば良い
Customerが更新されたときに、Orderも更新する必要があるのか?
受注とは全然別の文脈でCustomerが更新されたときも、いちいちOrderも更新するのか?
Orderをfetchする時に、Customerもfetchする必要があるのか?
同一のAggregateと見なすと、結合がかなり強くなる
上記の例で言えば、OrderとOrderItemは同じAggregateであることが望ましいが、
OrderとCustomerに関しては、そうではなさそうである
これは扱うドメインに大きく依存する
参考
/mrsekut-book-97816805025/111
https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/#:~:text=Avoid%20denormalized%20representations%20of%20data%2C%20especially%20if%20it’s%20mutable.%20Duplicating%20the%20same%20data%20in%20multiple%20places%20introduces%20a%20trivially%20representable%20illegal%20state%3A%20the%20places%20getting%20out%20of%20sync.%20Strive%20for%20a%20single%20source%20of%20truth.