データウェアハウスに格納されている計算値をいつ計算するかに関するいくつかのベストプラクティスを誰かが教えてくれることを期待していました。
次の例を考えてみましょう。
CREATE TABLE
(
MyFactID INT NOT NULL IDENTITY(1, 1),
OrderDimID INT NOT NULL, -- FK To OrderDimension
StartDate DATETIME NOT NULL,
CompletedDate DATETIME NULL,
ElapsedCalendarTimeInMinutes INT NULL,
ElapsedBusinessTimeInMinutes INT NULL
)
この例では、経過カレンダー時間(分単位)は、開始日から終了日までの時間(分単位)になります。そして、私たちの営業時間は、それらの暦日の間に利用可能だった労働時間を反映しています。
現在、ETL中にこれを計算し、両方の日付を挿入しています。これがこの操作を実行するための正しい場所であるかどうか疑問に思います。
他のいくつかの考えは次のとおりでした:
A)開始日と終了日のみをファクトテーブルに保存し、経過時間を分単位で計算し、関数を使用して営業日を計算する計算列を持つビューを作成することにより、インデックス付きビューを使用します。
B)Afterトリガーを使用して、挿入が発生した後の経過カレンダー時間と営業時間を更新します。これにより、完了日がnull以外の値に挿入または更新されます。
終了日や営業時間の計算に変更があった場合に反映されるように、DBで行う必要があると思います。ETL中にそれを行うと、問題が発生しやすくなるようです。
これについての考えは大歓迎です!
更新:この方法で決定された少なくとも6つの列があります。営業時間、営業時間、日数があります(営業日は12時間です)。次に、クライアントの分、時間、および日があります(クライアントの稼働時間のルックアップテーブルを介して決定されます)。次に、単純にカレンダーの分、時間、日があります(ただし、これらは保存されていません。分のみです)。これはDWであるため、すべてのデータが存在し、計算を必要としないことを期待していました。私には、計算された情報を取得するためにベースデータの上にビューを作成するよりも、ETLが正しく、どこにでも適用されるようにする方が作業のように思えます。