マスタメンテナンスで未来のデータを入力したいんですけど


マスタメンテの扱いは毎回困るところ。
どうもマスタデータには「最新」系のものと「無時間」系のものがあるらしい。
いつのトランザクションデータと結合しても問題ないのが「無時間」のマスタで、問題を起こすことがあるのが「最新」のマスタ。
元号マスタなんてのは無時間。
商品マスタとか部門マスタなんかが「最新」のマスタ。属性が今時点の値になっているので、古ーいトランザシクョンデータと結合すると「商品名が(過去の事実と)違う」「部門の所属セグメントが違う」みたいなことになる。


そういう属性はトランザクションデータ側にコピーしておけばとりあえず問題ないんだけど*1、ほんとに困るのは未来のデータを前もって入力したいとき。
例えば4/1から新入社員が1000人入ってくる会社で、3月中に新人の情報をちまちま入力していると、3月中の社員数が狂ってしまう。正しくは4/1の明け方に1000人分入力しなくてはならない。
あるいは4/1から組織図が変更になるんだけど、3月中に部門マスタを更新すると3月に出力する組織図が狂ってしまうとか。

教科書的にはどうする

マスタメンテなんてほとんど自動生成できる機能なんだけど、何も考えないで生成すると、適用日の明け方にまとめて更新しなくてはならないしんどいシステムができてしまう。
この問題は教科書的にはどう解決するのだろう。

  1. いいからユーザにがんばってもらう
  2. マスタの属性に適用開始日・適用終了日を追加する
  3. マスタは「表テーブル」「裏テーブル」の二重持ちにして、マスタメンテ機能は裏を更新する。で、適用日の0時にバッチで表にコピーする
  4. マスタ上にはIDしか置かない。その他全属性は別のテーブル(マスタ履歴テーブル)に移動。トランザクションデータはマスタではなくマスタ履歴テーブルを参照する


個人的には2.は嫌いだ。日付を指定しないとjoinできないからうっとうしいのだ。ID一発で等結合したい。
3.なんてどうでしょうね。今思いついたんだけど。スクラッチで作る気はしないけど自動生成しやすそうだ。
4.は3か月前からの宿題。こんなんで本当にアプリが書けるのかテストしてみる*2。そのうち。

*1:もっとスマートな解決策はないのかな。適用開始日・適用終了日を使う以外に

*2:UNIQUE制約の保全とかができなさそうだ。やっぱりダメか