論理削除フラグに一言
どういう実装になるのか気になったので書いてみる。
何が気になったかって一意制約。こういうデーターは「PKになるだろう」って説もあるが、昨今のフレームワークの作法で祖も行かないことも多い。さて本題。
物理削除(ログテーブルに移してからの)の場合、再度同じのデータをinsertしてもすでに削除されているので、一意制約に違反することはないけど、論理削除(フラグによる論理削除)の場合、思いっきり違反しますよね。
これをどうやって実装してるのか非常に気になります。
ちょっと考えてみた。
論理削除と合わせて一意制約
でも、再度登録されたデータを削除すると、ここで一意制約違反。
なので、削除フラグが0/1な値にならなくなる。削除時に値を取得して、その値に更新。値はPKのhashとか、削除フラグ用にシーケンスを用意するとかでいいだろう。
・・・筋悪な気がしてならない。
アプリからレコードを削除するのにどれだけコードを書くんだよ。
そもそもどれだけのレコードが削除される? 該当列につけるであろうindexの効果は?
制約は設けずに、アプリでチェック
一度selectしてデータの一意性を確認してからinsertすれば一意になる。
だけど同時更新があると駄目。
二つのトランザクション(A,B)があったとして、同時に同一のデータをinsertしようとする
- Aでselect。同一データなし
- Bでselect。同一データなし
- Aでinsert
- Bでinsert
ってなったときに同じ値ができてしまう。
select前にテーブルロックすれば回避できるがそれでいいの?
きっと、こういった問題のないエレガントな方法があるんだろうなー。