マスター系テーブルのカラムをトランザクション系テーブルに保持する考え方
コンビニの売り上げシステムのようなものを考えてみる。
商品テーブルがあって、そこには以下のようなデータが登録されているものとする。
商品コード 商品名 単価 1 ポテトチップス 98円 2 カップラーメン 150円 3 コカコーラ 120円 4 ペプシコーラ 120円
売り上げテーブルには以下のようなデータが登録されているものとする。
明細No 商品コード 売り上げ個数 1 1 1 2 1 1 3 3 1 4 2 3 5 4 2
※ 売り上げテーブルの商品コードは商品テーブルの外部キーとする
ある日、カルビーが倒産したとしてポテトチップスという商品がなくなったとします。
このとき、商品テーブルからポテトチップスのレコードを削除するとある問題が発生します。
トランザクションテーブルを集計したときに、商品コード=1の商品名がひけなくなってしまいます。
これを解決するには、以下の二つの方法があります
1.商品テーブルに削除フラグのカラムを追加する
2.売り上げテーブルの商品コードのカラムを商品名にする
1の場合だと、削除フラグがたっている商品が、バグによって有効な商品になってしまう可能性がある。あと、商品テーブルの商品名がuniq属性の場合、削除フラグがたっているレコードと同じ商品名を追加しようとして重複insertエラーになってしまう。
2の場合だと、性能的に問題がでてくるかも?
結論。
集計に使用する項目でかつマスター系テーブルにおけるその項目の属性がuniqの場合、レコード削除において必ず物理削除を行う必要がある。
つまり1は採用することはできず、2を採用することになる。