削除フラグを持つ理由 その2

FKを張られているマスタレコードの削除とか^^;
まあ、「削除」という運用仕様そのものの検討で解決することが自然。

例として、職業マスタテーブルのメンテを考えた時、

  • 職業マスタのレコードは削除される可能性はあるか?
  • 削除されるケースがある場合、その職業を選択しているユーザはどうなるか?
    1. 削除される職業を選択しているユーザがいる場合は、削除を許可しない
    2. 削除された職業を選択したユーザは無効なユーザとして扱う
    3. 削除された職業を選択していたユーザの職業は、「未選択」として扱う。
    4. 削除された職業を選択していたユーザの職業は、削除された職業をそのまま表示。

1の場合、FKの制約には引っ掛からないので、削除フラグ云々の検討は必要なし。物理削除で結構。

2の場合、物理削除してしまうと、FK制約に引っ掛かるので検討かな。。。例えば、ユーザレコードが100万レコードある場合、マスタを削除することで、ユーザレコード100万行に変更なしで無効として扱えるSQLでOKだが、FKの為、物理削除が不可能。但し、この仕様は採用される可能性は薄いと思う。

3は、対象レコードを削除ではく「未選択」として扱う状態にするか、論理削除後、外部結合で行が返ってこなければ、「未選択」とする手もある。。。どちらがいいんだろう^^; ユーザレコードには職業マスタのIDがFK制約で入っているので、個人的には前者かな)

4はユーザレコードからは参照されているので、論理削除状態ではない。こちらも「メンテナンス削除」状態として管理する。

この「メンテ削除状態」と「論理削除フラグ」が混同されてると、やっかいなことになったりしますよね^^;
仕様に沿った状態定義を設けることによって論理削除フラグを回避できることもあるかな。。。と。

持つ理由としては、2、3の検討次第となりそう。