削除フラグをめぐる悲劇

なんだか界隈が盛り上がっているので。
業務システム屋やってて一番大変だったのは取消オペレーションをめぐる開発。僕が入った時そのプロジェクトは既に火消しフェーズに入っており、天を焦がさんばかりの業火が幾人ものメンバーを焼き尽くしていた。僕らの掛けるバケツの水などものの役にも立たず端から蒸発していくのだ。
業務システムってのは追い詰められて「取りあえず動く」ものを作るところまでは案外簡単にリカバっちゃったりする。取りあえず動くものの恐ろしさは、通常パターンについては全く問題ないが異例パターンについて一切の考慮が入っていないところにある。そして、動くものを作っちゃった以上それを取りあえずで済ますことはほぼありえない。そうすると何が起きるか。異例処理を動かすための仕様を建て増ししていくのである。この時点でプロジェクトの失敗は約束されている。

変更・取消処理の恐ろしさを骨の髄まで味わったのはその時だ。変更オペレーションをする。すると、それに伴い、計算の変更をする必要が出てくる(ローンの繰り上げ返済をイメージしてみるといい)。問題は、それを取消時だ。前回の状態に復旧させるためには変更前の状態を覚えておかなければならない。恐ろしいことに、変更をするときに前回までのレコードを論理削除するのだ…つまり、取消は論理削除を取消せば良い…しかし、変更に次ぐ変更をした結果の取消の時、前回とは一体何なんだろうか。

業務データを扱うときにもっとも重要な点は業務テーブルは履歴テーブルを兼ねるべきではないということだと思っている。もし履歴が必要なのであれば、それは履歴専用テーブルを作るべきだし、業務テーブルに今有効でないデータは本来置かれているべきではない(もっとも、データに有効期限があるような「有効無効」は例外だろう)。

論理削除が有効なのは、それが物理削除と同じ意味を持ち、単に遅延メンテンナンスのためのフラグとして扱える時だけだと僕は思っている。少なくとも、「論理削除の取消」を許容するシステムは例外処理が爆発的に増える脆弱なシステムになってしまう危険性をもっているだろう。