0

オフィス用のDBを作成しています。約200人の従業員がいます。各従業員は、採用後 2 年以内に 12 のコースのうち少なくとも 1 つを完了する必要がありました (つまり、コースごとに修了日/資格取得日が異なります。20 年勤続の人もいれば、1 年だけの人もいます)。複数のコースを修了した人もいます。各コースは定期的に更新する必要があります (各更新期間は異なり、最後の更新日に基づいています)。テーブルの配置に悩んでいます。これが私が考えているものですが、データをレイアウトするための忙しくない方法があるかどうかを確認しようとしています. どの人がどのクラスを修了したかを示すクエリを実行できるようにしたいと考えています (したがって、3 つのクラス列すべてを確認する必要があります)。また、資格がいつ失効したか、または近づいているかを通知できるようにしたいと考えています。これまで私は'

ID Name    Class1    Class2    Class3  QualDt-Cl1 QualDt-Cl2 QualDt-Cl3  LstRequal1 ...
1  Bob      Art      Spanish           3/17/1989   9/12/2010              3/8/2012
2  Sally    Math                       8/31/2012
3  George   Physics            History 2/6/2005               7/6/1996
4  Casey    History                    6/8/2000 
5  Joe      English  Sports    Physics 12/10/1993  10/15/2001 4/22/2006

クラスは独自のテーブルにリストされ、各クラスの列はそこから取得されます。Qual Date Refresher は、最後の Refresher 日付に基づくクエリの計算列になります。
ある人が資格を取得したすべてのクラスを 1 つの列に配置し、特定の各コースの再資格取得に関連する日付を別の列に表示する方法はありますか?

4

2 に答える 2

0

データベースを設計するときにClass1Class2、のような名前の列を追加していることに気付いたときはいつでも、すぐに停止して、それらの列を親へのリンク (関係) でClass3呼び出される別の子テーブルに配置する方が理にかなっているかどうかを検討する必要があります。Classesこれには、次のようないくつかの理由があります。

  1. 誰かが 4 番目のコースを受講するとどうなりますか? 「それは決して起こらない」と言うのは、「決して長い時間ではない」という事実を無視しており、私たちの誰も未来を予測することはできません.

  2. 誰かがコースを受講したかどうかを確認するとき、本当に確認する必要があり(Class1 IS NULL) OR (Class2 IS NULL) OR (Class3 IS NULL)それは非常に面倒です。また、追加する必要がある場合は、その SQL コードをすべて修正する必要があることも意味します。Class4

  3. 同様に、「CPR」を行った人を見つけたい場合は、 (Class1 = 'CPR') OR (Class2 = 'CPR') OR (Class3 = 'CPR'). うん。

したがって、いくつかの手間を省き (実際には多くの手間がかかります)、Classesテーブルを作成します。

ID
ClassName
QualDate
(etc. )

...IDメインテーブルの ID 番号 (「外部キー」と呼ばれるもの) はどこにありますか。サンプル データから、Classesテーブルは次のようになります。

ID  ClassName   QualDate
1   Art         3/17/1989
1   Spanish     9/12/2010
2   Math        8/31/2012
3   Physics     2/6/2005
3   History     7/6/1996
...
于 2013-04-08T16:23:14.967 に答える