論理削除、物理削除

今の案件では、当初削除フラグを使って論理削除で行こうと考えていた。
が、業務的に意味のある論理キーに対して一意制約を貼ろうとすると、削除されたあとに再作成された場合、何も考えずにやるとPK重複一意制約違反になってしまう。
いちいち論理削除データがあればUPDATE、なければINSERTというのもめんどくさい。
(Daoで吸収できちゃえばいいのかもしれないけど)


で、削除されたデータを別の削除履歴テーブルに移すことにした。
じゃあ、論理削除フラグいらないじゃん、と思ったけど、論理削除は誰がいつ削除したかという情報(最終更新日時、ユーザー、プログラム)を残しているので、その情報はあとから追えると誰がいつけしたの?とかの調査の時に大変ありがたい。
なので、論理削除されたら、それをトリガでひろって(update trigger)削除履歴テーブルに書きこんでから物理削除するというトリガを作った。


postgresqlは、triggerに処理を記述するのではなく、triggerで関数を指定してその関数で処理をするという形。ちょっと手間取ったけど無事望む動作となった。
回り道したけど、結果なかなかいい形になったのかもしれない。