値に有効期間を持つマスタデータの設計パターン

値に有効期間を持つマスタデータの設計パターンを整理してみました。FowlerのTemporal Patternsであげられているものを参考にしました。

設計パターンとしては大きく3つの方法を考えました。

  1. 有効期間ごとにマスタデータを保持している(Temporal Object)
  2. マスタデータが有効期間ごとに属性を保持している(Temporal Property)
  3. マスタデータが有効期間ごとに別マスタとの関連を保持している(Effectivity)

さらに、トランザクションデータから過去や未来のマスタデータを識別子で直接参照できるようにするかしないかで分類すると、最初のパターンのTemporal Objectを、直接参照できるパターンと出来ないパターンの2つに分類できます。ちなみにTemporal Propertyは属性をValueオブジェクトとして表現しているだけなので直接参照できません。Effectivityは別リソース扱いなので必ず直接参照することが可能になります。

これら4つのパターンを実際にドメインモデルと論理ERで記述してみました。

このように整理すると、Temporal ObjectとEffectivityはどちらも有効期間ごとのデータを参照利用可能なのですが、バージョン番号を明確に意識した参照を利用する以外は、識別子を意味的に完全に分離したEffectivityのほうが混乱が少ないと考えています。



追記

これ以外のパターンって、思い浮かばなかったのですが、なにかあるかもしれない。


未来のデータを入力する最初のモデルでEffectivityをあげれなかったのは、修行がまだまだ足りないと感じました。Temporal Objectの適用期間を内部エンティティとして切り出せばEffectivityの構造になるのですからね。