tl;dr データベースのデータと設計の処理に関する一般的な質問:
ある時点で他のデータからデータを導出し、その導出されたデータを別のテーブルに保存して、その特定の時点での値の履歴を保持することは許容されますか? または、決して保存しないでください他のデータから派生したデータではなく、必要なときにのみ既存のデータから必要なデータを派生させますか?
私の特定のシナリオ:
人々の休暇日と休暇日のステータスを記録するデータベースがあります。何日残っているか、何日かかったかなどを追跡します。
設計要件の 1 つが変更され、特定の年の 12 月 31 日に人が何日残っているかを示すことができるようになりました。したがって、「ボブは 2010 年 12 月 31 日に 14 日残っていました」と言うことができる必要があります。
これを行うには、次の 2 つの方法があります。
12 月 31 日に、その時点で全員の残り日数を取得し、その時点での EmployeeID、Year、および DaysRemaining を持つ "YearEndHistories" のようなテーブルにそれらを挿入する SQL Server エージェント ジョブ。
YearEndHistories テーブルは保持しませんが、特定の時間に所有されている日数を知りたい場合は、その特定の時間までに存在する追加および削除されたすべての休暇をループします。
#1 に伴う確実性が気に入っています --- 記録された値は管理者によって見直され、その数値が変化することについての議論や可能性はありません。#2 では、効率が良いと思います。維持するテーブルが 1 つ少なくなり、実際のテーブルには派生データが存在しません。しかし、目に見えないバグがすり抜けて、人々の歴史的価値の計算が台無しになり始めるなど、奇妙な恐怖があります。2020 年に、「2012 年は 9.0 日ではなく 9.5 日で終わった! 私の半日はどこに行った?!」というようなことはしたくありません。
私たちが決定したことの 1 つは、前年度の値を変更することはできないということです。つまり、前の暦年に戻って休暇日などを追加することはできません。過去にミスがあったかどうかに関係なく、年末の値がTHE値です。間違いが発見された場合は、その年の休暇に報酬を与えるか差し引くことでバランスを取ります。