0

tl;dr データベースのデータと設計の処理に関する一般的な質問:

ある時点で他のデータからデータを導出し、その導出されたデータを別のテーブルに保存して、その特定の時点での値の履歴を保持することは許容されますか? または、決して保存しないでください他のデータから派生したデータではなく、必要なときにのみ既存のデータから必要なデータを派生させますか?

私の特定のシナリオ:

人々の休暇日と休暇日のステータスを記録するデータベースがあります。何日残っているか、何日かかったかなどを追跡します。

設計要件の 1 つが変更され、特定の年の 12 月 31 日に人が何日残っているかを示すことができるようになりました。したがって、「ボブは 2010 年 12 月 31 日に 14 日残っていました」と言うことができる必要があります。

これを行うには、次の 2 つの方法があります。

  1. 12 月 31 日に、その時点で全員の残り日数を取得し、その時点での EmployeeID、Year、および DaysRemaining を持つ "YearEndHistories" のようなテーブルにそれらを挿入する SQL Server エージェント ジョブ。

  2. YearEndHistories テーブルは保持しませんが、特定の時間に所有されている日数を知りたい場合は、その特定の時間までに存在する追加および削除されたすべての休暇をループします。

#1 に伴う確実性が気に入っています --- 記録された値は管理者によって見直され、その数値が変化することについての議論や可能性はありません。#2 では、効率が良いと思います。維持するテーブルが 1 つ少なくなり、実際のテーブルには派生データが存在しません。しかし、目に見えないバグがすり抜けて、人々の歴史的価値の計算が台無しになり始めるなど、奇妙な恐怖があります。2020 年に、「2012 年は 9.0 日ではなく 9.5 日で終わった! 私の半日はどこに行った?!」というようなことはしたくありません。

私たちが決定したことの 1 つは、前年度の値を変更することはできないということです。つまり、前の暦年に戻って休暇日などを追加することはできません。過去にミスがあったかどうかに関係なく、年末の値がTHE値です。間違いが発見された場合は、その年の休暇に報酬を与えるか差し引くことでバランスを取ります。

4

2 に答える 2

4

はい、特に計算が複雑である、頻繁に呼び出される、またはあまり頻繁に変更されない場合 (例: ゲームのハイスコア テーブル - 非常に頻繁に表示されますが、内容が変更されるのはますますまれな場合に限られます) の場合は特に、許容されます。プレーヤーは非常にうまくやる)。

原則として、可能な限りデータを正規化し、パフォーマンス上の理由から必要に応じて派生フィールドまたはテーブルを追加します。

あなたの状況では、計算は比較的単純に見えます - 付与された従業員の休暇日数 - 取得日数ですが、それはあなた次第です。

余談ですが、データが関係している場合は「ループ」について考えるのではなく、データ全体をセットとして考えることをお勧めします。何かのようなもの

SELECT StaffID, sum(Vacation)
from
(
    SELECT StaffID, Sum(VacationAllocated) as Vacation 
    from Allocations
    where AllocationDate<=convert(datetime,'2010-12-31' ,120)
    group by StaffID
    union
    SELECT StaffID, -Count(distinct HolidayDate) 
    from HolidayTaken
    where HolidayDate<=convert(datetime,'2010-12-31' ,120)
    group by StaffID
) totals
group by StaffID
于 2012-09-27T08:23:40.140 に答える
0

派生データは、正規化では回避される推移的な依存関係のように思えます。それが一般的なルールです。
あなたの場合、パフォーマンスを犠牲にすることなく、より良い「可聴性」を提供する#1を選択します。

于 2012-09-27T08:30:50.337 に答える