値に有効期間を持つマスタデータの設計パターン
値に有効期間を持つマスタデータの設計パターンを整理してみました。FowlerのTemporal Patternsであげられているものを参考にしました。
設計パターンとしては大きく3つの方法を考えました。
- 有効期間ごとにマスタデータを保持している(Temporal Object)
- マスタデータが有効期間ごとに属性を保持している(Temporal Property)
- マスタデータが有効期間ごとに別マスタとの関連を保持している(Effectivity)
さらに、トランザクションデータから過去や未来のマスタデータを識別子で直接参照できるようにするかしないかで分類すると、最初のパターンのTemporal Objectを、直接参照できるパターンと出来ないパターンの2つに分類できます。ちなみにTemporal Propertyは属性をValueオブジェクトとして表現しているだけなので直接参照できません。Effectivityは別リソース扱いなので必ず直接参照することが可能になります。
これら4つのパターンを実際にドメインモデルと論理ERで記述してみました。
このように整理すると、Temporal ObjectとEffectivityはどちらも有効期間ごとのデータを参照利用可能なのですが、バージョン番号を明確に意識した参照を利用する以外は、識別子を意味的に完全に分離したEffectivityのほうが混乱が少ないと考えています。
追記
これ以外のパターンって、思い浮かばなかったのですが、なにかあるかもしれない。
未来のデータを入力する最初のモデルでEffectivityをあげれなかったのは、修行がまだまだ足りないと感じました。Temporal Objectの適用期間を内部エンティティとして切り出せばEffectivityの構造になるのですからね。