web-dev-qa-db-ja.com

主キーを決定するときに、DateTimeフィールドの日付部分を使用できますか

給与計算システムを設計しています私はいくつかのテーブルでデータベースを設計しました。この質問は次のテーブルに関連しています

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の日付部分を取得する可能性があるかどうかです。

3
CAD

日付フィールドを主キーとして使用できますが、フィールドのPARTにキーを設定することはできません。日付だけを含む別のフィールドを作成する必要があります。

この特定の条件は、とにかくそれをテーブルの主キーに組み込むことによって通常は強制されるものではありません。あなたの「従業員は2つの場所で同じ日に同じシフトを2回働くことはできない」はビジネスルールであり、これは必ずしも同じであるとは限りません。 (善意は知っている、従業員にスプリットシフトを行わせる場所が非常に多すぎる...)これを処理するより一般的な方法は、主キーの自動インクリメントフィールドを生成し、ビジネスを実施することです。ルールはユーザーインターフェースに近いところにあります。

8
mjfgates