1

これは、データベースを設計する際のベストプラクティスの全体的な質問であり、ネット上で答えを見つけるために質問を正しく表現することができませんでした.

従業員の安全トレーニングに関する情報を保持しているデータベースがあります。要件に関する情報は、監査目的で保存する必要がありますが、要件は年々変化する可能性があります。従業員が何をする必要があり、どれだけ完了したかを記録しておく必要があります。

私の最初の反応は、履歴データのテーブルを作成し、従業員がアクションを完了するか、アクションを完了するのに必要な時間が経過するたびに、基本的に「スナップショット」を保存することでした。間違った情報を指していません。

実装時にこれを変更し、既存の要件を変更しないようにアプリケーションをセットアップしました。要件が変更されるたびに新しい要件が作成されるため、古い要件はデータベースに残り、履歴テーブルによってポイントされます。メイン テーブルの要件テーブルでは、古い要件が非アクティブとしてマークされ、アプリケーションから削除することはできません。

この問題は以前にも発生したと確信していますが、実行可能な回答を自分で検索するのに十分なほど明確に説明することができませんでした. 私の質問は、この状況で進める最善の方法は何ですか? 私の現在の実装は良いものですか?私の最初の反応は良かったですか?両方よりも優れた別の方法はありますか?

余談ですが、この種の問題 (冗長データの保存、履歴データの保存、監査データの保存、何と呼べばいいのかわかりません) を表す単語やフレーズがあれば教えてください。

4

1 に答える 1

0

私が理解している限り、従業員と関連するタスクがあります。従業員用に 1 つ、タスク用に 1 つのテーブルを作成します。別の多対多テーブルがこれらをリンクします。タスク テーブルには、開始/終了列のステータスと日付が表示されます。タスクが現在有効である場合は、有効終了日を null のままにするか、値を 1/1/2999 に設定できます。タスクを照会するときは、特定の日付の時点で有効なタスクを取得できるように、日付を指定する必要があります。null値を使用することにした場合、where句は次のようになります

ここで、t.DateEffectiveFrm<=@AsOfDate および (@AsOfDate < t.DateEffetiveTo または t.DateEffetiveTo は null)

現在有効なタスクに対して遠い将来 (2999 年 1 月 1 日) の日付値を使用する場合、where 句はさらに単純になります。

ステータス変更の履歴を保持するステータス テーブルを追加することも検討してください。

于 2013-09-12T18:07:48.150 に答える