マスタテーブルの設定

ちょっとDBアクセスについて調べていたところ、以前のプロジェクトでの出来事を思い出した。

この問題は教科書的にはどう解決するのだろう。

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


個人的には2.は嫌いだ。日付を指定しないとjoinできないからうっとうしいのだ。ID一発で等結合したい。

マスタメンテナンスで未来のデータを入力したいんですけど - 極北データモデリング

以前僕が参加した大手SIerのプロジェクトでは2.になっていた。で、そのとき起こった障害が、IDと処理日付で該当レコードを引っ張ってこようとしたら、マスタの設定ミスで2件取得できてしまい、結果を1件しか想定していなかったDAOのあたりで落ちたというもの。2.の場合、テーブル内部で整合性を取る必要があるけど、いつの日付でもIDを指定すると1件しか取得できないっていうのはRDBMSの整合性制約でできるんだっけ?そのテーブルを検査するSQLを書くとか妙なことになりそうだ。かといって削除フラグを操作すると本末転倒。3.や4.は時刻が変わるのを待つ以外に更新バッチが動くので運用やジョブ設計で痛い目見そう。