2010年5月2日日曜日

削除フラグって必要?

休日なので、結論の出ない軽い話題を。

DB設計の時に、場合によっては全テーブルに「delete_flag」なんていう名前でフラグを持たせることがままあります。
テーブルのデータを実際に削除せずに、「削除フラグ(delete_flag)」をONにすることで「削除したものとして扱いますよ」というフラグです。

ちなみに、実際にデータを削除することを「物理削除」、削除フラグを立てて削除したものとみなすことを「論理削除」と呼んだりもします。

この削除フラグ、特に意識せずについつい付けてしまうことが多いのですが、本当に必要なのかね・・・?というのが趣旨です。

※恐らく日本では、ある程度の規模以上のシステム開発の常識では削除フラグは絶対必要だと考えられていますので、開発リーダーに「削除フラグ要らないんじゃないっすか」みたいなことを言ってみて一蹴されても責任は負いません。


■削除フラグの根拠

削除フラグを付ける根拠としては、

1. DELETE処理よりUPDATE処理の方が早い
2. 業務データは消さない(or 履歴を残したい)

の2点が真っ先に挙げられると思います。

1.の場合、バッチ処理で後から物理削除したりもします。


■UPDATEの方が早い?

DELETE処理よりUPDATE処理の方が早いので削除フラグを持たせる、という理屈は納得できます。
ただ「そこの差」がクリティカルになるシステムは極めて限定的なものだと思われます。
DELETEとUPDATEでベンチマーク取った訳ではないですが、SQL改良したり色々キャッシュさせたり、他にするべきこと一杯あるんじゃないかな、と思っちゃったりします。


■業務データは消さない?

履歴を持ちたいから削除フラグを付ける、という理屈は納得できません。
履歴が欲しければ履歴テーブルにINSERTするべきで削除フラグで代用すべきではないと思います。
実際、今まで開発してきたシステムで履歴を参照する必要がある場合は必ず履歴テーブルを別途用意していましたので、削除フラグなんて有っても無くても一緒でした。

履歴テーブルがないテーブルの削除データを参照することは稀ですし、その必要性が出てきた段階で何だか設計間違ってるような気がします(感覚的なものですが)。

「データ復旧するかもしれないしな~」なんて思いながら削除フラグを付けることも多いのですが、データ復旧が必要な時点でそもそもシステムとして不備がある訳で・・・。

「削除したことを知る」ためのオペレーションログのような使い方も削除フラグにはあるようですが、その場合でも、正攻法はロギングの処理をちゃんと実装するべきでしょう。


■削除フラグの弊害

削除フラグがある為にいちいちSQLが面倒なことになります。
where delete_flag = '0'
って絶対書かないといけない。

SELECTの時だけでなく、UPDATEの時も毎回々々
where delete_flag = '0'

joinしてるとテーブルの数だけ削除フラグを条件に追加しないといけない。

ORマッパーなんて使ってみた日には、更にひどいことになります。
ORマッパーの機能でテーブルエンティティ間のリレーションを定義してみたものの、削除フラグだけ別に処理しないと意図するデータが取得できなくなります。
※この辺考えてくれてるORMって無いような気がします。削除フラグって日本独特なのかな・・・?

「多言語化するかも」と思ってつけておいた言語IDなんかも同じような悲劇を生みますよね?
毎回々々
where lang_id = 'ja'
みたいな・・・。
結局多言語化なんてしたことないし。

また、データを削除する際も削除フラグだけONにすれば良いわけではなく、個人情報が含まれているとデータのマスク処理も必要になります。


■削除フラグは要らない、かも

まぁ、好き好きなので結論は出ないんですが、仮に

A. DELETE処理よりUPDATE処理の方が早い、なんてことは気にしない
B. 履歴を残したい、なら履歴テーブルを作るべき

とするのであれば、削除フラグを追加すると、

1. SELECT、UPDATEのクエリ発行時に無駄な手間が毎回必ず必要になる
2. 物理削除する場合はバッチを別途作成する必要がある
3. 論理削除の際にデータにマスクをかける必要がある
4. JOINが面倒
5. 履歴として参照することはない

なんて削除フラグはわざわざシステムを複雑にするため以外の何者でもないように思えてきます。

ただ、「心持ちの問題」として稼動していた業務データを永久に葬り去る物理削除には多少のためらいもあります。
getterやsetter結構好きだったり、更新日時と作成日時をテーブルに持たせたりしますので、どちらかと言えば「削除フラグ擁護派」なのですが、やっぱり冷静に考えれば削除フラグ意味無いんじゃないかと思い出した、そんな今日この頃です。これからはためらいの心にケリをつけて、「削除フラグ撲滅派」に鞍替えします。

おしまい。

0 件のコメント:

コメントを投稿