給与計算システムを設計しています私はいくつかのテーブルでデータベースを設計しました。この質問は次のテーブルに関連しています
EMPLOYEE (Employee_ID [pk], Name,... etc)
LOCATION (Location_ID [pk], Name, Address, ...etc)
1人の従業員が複数の場所で作業でき、1つの場所で複数の従業員が作業しているため、これら2つのテーブルには多対多の関係があります。
これら2つのテーブルは、ATTENDANCE
テーブルを介して関連付けられています。
ATTENDANCE (Employee_ID, Location_ID, Shift_Type, In, Out)
シフトタイプは「Day」または「Night」のいずれかであり、「In」/「Out」フィールドはDateTime
フィールドです。シフトタイプは、「In」フィールドの日付に基づいて決定されます。たとえば、従業員のIn
フィールドが-06/22/2014 07:30:00 PM
であるとすると、シフトタイプはNight
で、シフトは22/06/2014に属します。 (彼のOut
時間は23/06/2014 07:30AM
になります;それは翌日です)
条件は、従業員が2つの場所で同じ日に同じシフトで2回勤務できないことです。しかし、従業員はある場所で日中、別の場所で夜間働くことができます。
私の最初の主キー選択のATTENDANCEテーブルは(Employee_ID + In)
でしたが、In
の時間が2つの場合に少し異なる場合、従業員が同じ日に同じシフトで作業できるため、これは誤りです。
これで、主キーが(Employee_ID + Shift_Type + Shift_Date)
のようになるはずです。しかし問題は、出席表に日付フィールドがないことです。しかし、私はIn
フィールドがあるDateTime
フィールドを持っています。
問題についての私の理解が正しいことを願って...、
私の質問は、別のフィールドをShift_Date
としてATTENDANCEテーブルに追加せずに、このテーブルのPRIMARY KEY
を作成するときに、フィールドIn
の日付部分を取得する可能性があるかどうかです。
日付フィールドを主キーとして使用できますが、フィールドのPARTにキーを設定することはできません。日付だけを含む別のフィールドを作成する必要があります。
この特定の条件は、とにかくそれをテーブルの主キーに組み込むことによって通常は強制されるものではありません。あなたの「従業員は2つの場所で同じ日に同じシフトを2回働くことはできない」はビジネスルールであり、これは必ずしも同じであるとは限りません。 (善意は知っている、従業員にスプリットシフトを行わせる場所が非常に多すぎる...)これを処理するより一般的な方法は、主キーの自動インクリメントフィールドを生成し、ビジネスを実施することです。ルールはユーザーインターフェースに近いところにあります。