レコードの論理削除_その2

Read More

レコードを論理削除する方法は前回のレポートで書いた。


今回はそのステータスに加えて時間を参照させる。


まずテーブルにreleaseとrecallというカラムを追加する。
releaseもrecallもカラムの型はdatetime。
いつからいつまで、という期間を指定する為に使う。


さて今まではstatusが1の時にSELECTでヒットするようにしていたが、
今度はstatusが1であり、さらにreleaseとrecallで指定した時間内であること、という条件にする。


■ユーザ側で呼び出す例
SELECT
 id
FROM
 example
WHERE
 status=1
AND
 release <= now() AND recall > now();

releaseには2011/03/01 00:00:00 を、
recallには2011/05/01 00:00:00 が格納されているものとする。


上記のように記述することによって、
3/1~5/1までの間のみこのレコードは表示される。


ただしこの方法、全てのテーブルに対して行ってしまうとSQLの記述がすんごい複雑になるので注意が必要。


--
また別のアプローチもある。


それはcrontabコマンドを使った方法。
つまり定期的にスクリプトを実行してレコードのstatusをチェックし書き換える。


こちらの方がSQLはスマートになって良いのだけど、
crontabの実行によってサーバに高負担がかかることと、
crontabが利用できないサーバであった場合設定の変更が必要になるなど利用が難しい。

■statusを1にするバッチ
UPDATE
 example
SET
 status=1
WHERE
 status=0
AND
 release <= now() AND recall > now()



■statusを0にするバッチ
UPDATE
 example
SET
 status=0
WHERE
 status=1
AND
 recall < now()



cronを利用すれば色んなことができるようになる。