TL;DR

イミュータブルデータモデルで、「入会」のように長い期間にわたるイベントを扱うパターン。期間全体を 1 つのエンティティにし、その中で起きる詳細イベントは日時を 1 つだけ持つ INSERT のみのエンティティで表す。更新が起きるのは、ロングタームイベントの現在のステータスだけになる。

仕組み

kawasima 氏の イミュータブルデータモデル のページでは、次のように説明されている。

「入会」という長い期間でのイベントに対し、その中で発生する詳細イベント(入会申し込み、審査、会員証発行)はそれぞれエンティティとして表す。
詳細イベントは共通して日時属性を持つので、スーパータイプとして入会アクティビティを持つ。
こうすると、「入会申し込み」の業務では、入会、入会アクティビティ、入会申し込みにそれぞれデータがINSERTされ入会エンティティの現在入会ステータスは「入会申し込み」になる。
続く「審査」の業務では、入会アクティビティ、審査にデータがINSERTされ、入会の現在入会ステータスが「審査」に更新される。
こうして詳細イベントはただ1つの日時属性をもつエンティティでINSERT ONLYなデータライフサイクルが実現され、更新が発生するのはロングタームイベントの「入会」のみになる。

自分の理解

各詳細イベントのテーブルで、入会アクティビティへの参照が外部キーであり主キーでもある点は目から鱗だった。ORM に毒されていると改めて痛感した。

関連

出典