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[]
}
望ましい設計はどちらか?
OrderとCustomerが同一のAggregateであるなら、前者
そうでないなら、後者
抑えるべきは、
Entityはimmutableである
Aggregateは、最小の更新単位である
Aggregateは、最小の永続単位である
上記の例で言えば、以下のようなことを考えれて判断すれば良い
Customerが更新されたときに、Orderも更新する必要があるのか?
受注とは全然別の文脈でCustomerが更新されたときも、いちいちOrderも更新するのか?
Orderをfetchする時に、Customerもfetchする必要があるのか?
同一のAggregateと見なすと、結合がかなり強くなる
上記の例で言えば、OrderとOrderItemは同じAggregateであることが望ましいが、
OrderとCustomerに関しては、そうではなさそうである
これは扱うドメインに大きく依存する
参考