質問: MySQLでタイムシートのテーブルを作成したいと考えています。 テーブルには「開始時間」と「終了時間」のカラムを入れる予定ですが、 開始時間と終了時間から求められる「実働時間」のカラムも入れるべきかで悩んでいます。 「実働時間」カラムを作らない場合、テーブルの構造をすっきりさせることができますが、 「実働時間」のデータを使用したいときは、その都度計算しなければなりません。 このような場合はどちらにするべきでしょうか。
回答: 計算で求められる値を、都度計算するか結果を保存しておくかというのは悩ましいところです。 しかしこの質問について言えば、計算方法は制度などによって変化する可能性がありますが、過去の実働時間は一度確定すれば変化することがありませんし、変化しては困ります。ですので、入力時点(または締め日など特定の時点)で計算した値を保存する方法にしなければなりません。 都度計算する場合、計算方法が変わったからと言って単純にプログラムの計算方法を変えると、過去分の実働時間も変化してしまいます。これは非常にまずいです。これを避けるには、タイムスタンプを見てその時々に応じた計算を行うロジックを組む必要があります。新たな計算方法を追加する際に、過去分に影響する判定条件や計算のバグがあれば、過去の時間が変化してしまいます。やはりまずいです。