論理削除フラグに一言

どういう実装になるのか気になったので書いてみる。

何が気になったかって一意制約。こういうデーターは「PKになるだろう」って説もあるが、昨今のフレームワークの作法で祖も行かないことも多い。さて本題。


物理削除(ログテーブルに移してからの)の場合、再度同じのデータをinsertしてもすでに削除されているので、一意制約に違反することはないけど、論理削除(フラグによる論理削除)の場合、思いっきり違反しますよね。

これをどうやって実装してるのか非常に気になります。


ちょっと考えてみた。

論理削除と合わせて一意制約

でも、再度登録されたデータを削除すると、ここで一意制約違反。

なので、削除フラグが0/1な値にならなくなる。削除時に値を取得して、その値に更新。値はPKのhashとか、削除フラグ用にシーケンスを用意するとかでいいだろう。


・・・筋悪な気がしてならない。

アプリからレコードを削除するのにどれだけコードを書くんだよ。

そもそもどれだけのレコードが削除される? 該当列につけるであろうindexの効果は?


制約は設けずに、アプリでチェック

一度selectしてデータの一意性を確認してからinsertすれば一意になる。

だけど同時更新があると駄目。
二つのトランザクション(A,B)があったとして、同時に同一のデータをinsertしようとする

  1. Aでselect。同一データなし
  2. Bでselect。同一データなし
  3. Aでinsert
  4. Bでinsert

ってなったときに同じ値ができてしまう。
select前にテーブルロックすれば回避できるがそれでいいの?


きっと、こういった問題のないエレガントな方法があるんだろうなー。