レコードの論理削除を実装する

Read More

DBの話。


各テーブルの整合性を保つため、レコードの物理削除はなるべくしない方がよい。

それは参照しているレコードが物理的に削除されてしまうと、関連するレコードは表示されないか、もしくはバグってしまう可能性がある。


これを回避する為、レコードの物理削除を止め、変わりにレコードにstatusというカラムを持たせ、0、1、9といういずれかの数値を入れる。


これはレコード自身の状態を表す単純なステータスで、それぞれ
 1が通常状態、
 0はユーザ権限にて行える削除状態、
 9はアドミン権限にて行える削除状態

を表している。


つまりレコードは削除状態を2段階持っている。


ユーザが削除したレコードは、アドミン権限から入る管理画面上ではまだそのレコードが確認できる状態である。
そして管理者には「ユーザが削除したんだね」ってわかる。
この状態がstatus:0。



管理者が管理画面上から削除した場合はユーザ側からも消える。
この状態がstatus:9となる。



以下に呼び出し例を記す。

■ユーザ側で呼び出す
SELECT
 id
FROM
 example
WHERE
 status=1;



■アドミン側で呼び出す
SELECT
 id
FROM
 example
WHERE
 status IN (0, 1);



毎回WHERE句でstatusを指定する手間が増えるが、
こうすることによってレコードを削除したっぽい扱いができる。


たぶん似たようなことは大抵誰でもやっていると思う。



なので次はさらにもう一歩進んだ、
「レコードの状態+時間」でやってみたいと思う。



続く
http://shirasaya.if.land.to/?m=detail&hid=136