TwitterでSQLの話題が流れていたのを見て、ふと自分がSQLを触ったきっかけを思い出したので、こんなツイートをしたところ、思った以上に皆さんから反応があって驚きました。
とあるマスタ画面、登録ボタンはあるのに、削除ボタンがない。
— 松田軽太 (ソリュエイ亭門下生)5550 (@matudakta) 2023年3月27日
ワイ「削除したい場合はどうするんですか?」
ベンダー「マスタは一度、登録したら削除しないで下さい」
ワイ「どうしても削除したい場合はどうれば?」
ベンダー「SQLでDeleteして下さい」
ワイ(え?なんでや?)
さて、SQLで直接マスタデータを修正したり、削除したりするという運用はハッキリ言ってオススメできません。
そりゃそうですよね。
間違えて実行したらそのマスタの全データを消してしまうかもしれないし、うっかり書き間違えるとデータベースをぶっ壊してしまいますから。
しかし、そうは言ってもシステム側で用意された画面ではどうにもできないこともあったりします。
ツイートした作業は昔、使っていた管理システムのマスタ画面に必要な機能が揃ってなかったことで仕方なく行っていたのです。
文字だけでは分かりにくいので、マスタ画面のイメージをご紹介するとこんな感じ。
ものすごく質素ですよね。しかもなぜか登録ボタンしかなかったのです。
ではこのマスタ画面には何が必要だったのでしょうか?
昨今、業務システムの内製化が流行っているので、初めてマスタ管理画面を作成する人もいるかと思います。
なのでマスタ画面を作る時に意識すべき点について整理してみたいと思います。
マスタ画面に必要な機能は「CRUD(クラッド)」
システム設計を行われている人であれば、ご存じかと思いますが、そうでない人もいらっしゃると思うのでCRUD(クラッド)について説明します。
たとえば商品マスタや取引先マスタを管理する画面に必要な機能は何でしょうか?
CRUD(クラッド)と呼ばれている4つの動作のことです。
CはCreate → データ作成
RはRead → データ読み取り
UはUpdate → データ更新
DはDelete → データ削除
つまり登録、修正、照会、削除です。
当たり前といえば当たり前ですよね。
しかし先ほどの画面例では「登録」機能しかありませんでした。
これでは運用するユーザー側としては機能が不足して困りますよね。
たとえば将来、拠点の名称が変更になるかもしれません。
あるいは将来、拠点が移転して廃止されるかしれません。
そのように業務に変更があった場合に困ることになるのです。
削除機能で気をつける点
では先ほどのマスタ画面を例にすると、もし拠点が廃止された場合、マスタデータを削除すればいいのでしょうか?
それまで長い間、運用していた拠点であれば実績データがあるハズです。
在庫管理であれば入出庫データあるでしょうし、売上管理であれば販売実績データがあるでしょう。
なので拠点マスタのデータを削除してしまうと、実績照会画面で名称など必要な情報が表示されなくなってしまう可能性があります。
かといってそのまま廃止になった拠点のデータをそのまま残してしまうと、作業者が間違えて廃止された拠点コードを選択してしまうかもしれません。
そのような事故を防ぐための工夫が必要になりますよね。
「使用禁止区分」を設ける
マスタに「使用禁止区分」という項目を設けて、ここが「使用禁止」の状態になっている時は受注出荷画面などで選択できないようにチェック機能を仕掛けておくという方法があります。
もし使用禁止になっている拠点を選択したら「使用禁止の拠点です」といったエラーメッセージを表示します。もしくはドロップダウンリストからの選択であれば、リストに表示しないようにします。
論理削除する
使用禁止と似ていますが、マスタのデータ項目に「レコード状態」のようなステータスを設けて判断できるようにする方法もあります。
マスタ画面で削除した場合、物理的にデータを削除するのではなく、削除されたことが分かるように「レコード状態」に1をセットして判別できるようにします。
「レコード状態」が1の削除状態の場合は、受注出荷画面などで選択できないようにしておきます。
論理削除のメリットは「レコード状態」という項目で判断するので、誤って削除しても、すぐにデータを復活させることができる点にあります。
なので特にマスタの運用管理では、可能であれば使用禁止区分や論理削除を行い、物理的なデータ削除はしない方が無難です。
たとえば実績データが存在しているマスタデータをうっかり削除しようとしたら場合には、こんな感じでエラーメッセージが表示されると安心ですよね。
うっかり削除してから気がついても手遅れになる
誤ってマスタデータを削除してしまったとしても、削除した人はその場では困りません。
困るのは、誤って削除してしまったマスタデータを使う人です。
なので削除したタイミングでは誤って削除してしまったことにも気がつけない可能性が高いのです。
削除したデータそのものが物理削除されてしまうと、どのデータを誰がいつ削除したのかも皆目見当がつかなくなります。
そういったことも考えると論理削除の方が安全と言えるのです。
システム設計する時に「どんな機能が必要か」を想像しよう
Excelだと不要なデータがあった場合は行を削除すると思います。
しかしデータベースを使った管理システムは、さまざまなデータが絡み合っています。
そのため一見、不要であると思ったデータが、実は他のシステムでは使っていたなんてこともあったりします。
ExcelでいうとVLOOKUP関数などで、他のシートのデータを参照しているような感じだと思ってもらえれば分かるかと思います。
これからノーコード・ローコード開発などで、業務システムを内製化をされる人は、そのシステムが運用されてデータが蓄積されたらどんなことが起こるのかを想像しながら画面や機能を設計してみると良いでしょう。
システム開発の参考になる書籍をご紹介しておきます。