従業員が自分の rfid カードを読み取った後、複数の rfid ハードウェア デバイスからレコードを取得します。これらの記録には
- デバイスID
- タイムスタンプ
- DST / 非 DST
- UID (RFID カードの)
- プロジェクト ID (ユーザーが選択)
このスタックオーバーフローの質問を読んだ後、データベースを設計する方法は 2 つあります。
- イベントのようなテーブル デザインを使用する (各レコードは新しい行です)
- タイムクロックのようなテーブル デザインを使用する (各イン/アウト ペアは新しい行です)
後者の設計を使用すると、レポート/分析が非常に簡単になります (たとえば、「x 時間以上働いた従業員は?」、「記録がない従業員は?」、「従業員あたりの合計時間は?」、...)。
オプション1
しかし、インレコードとアウト レコードの上記のすべての情報を保存する必要があるため、テーブルのデザインは次のようになります。
RecordId | EmployeeId | TimestampIn | DstIn | UidIn | ProjectIdIn | TimestampOut | DstOut |...
これは、私が必要とすることを達成するための正しい方法のように「見えません」。
オプション 2
次に、詳細について 2 番目のテーブルを使用することを考えました。
記録:
RecordId | EmployeeId | TimestampIn | TimestampOut
レコードの詳細
RecordDetailsId | RecordId | Timestamp | Dst | Uid | ProjectId
このようにして、必要に応じて詳細にアクセスできますが、レコード テーブルで直接基本的な計算を行うことができます。
オプション 3
3 番目のオプションは、イベント テーブルを使用することです。
RecordId | EmployeeId | Timestamp | Dst | Uid | ProjectId | In/Out
これは間違いなく機能しますが、後で分析/レポートするのが難しくなります (上記を参照)。
したがって、私の質問は次のとおりです。上記の設計のいずれかが私の問題の「ベスト プラクティス」と見なされますか?また、オプションの 1 つを使用する必要がありますか? オプション1は期間などを計算する方法では良さそうに見えますが、追加の列を追加する必要がある場合、これは混乱してしまうのではないかと心配しています.
注: レコードがイン/アウトされているかどうかは、従業員が最後に行ったエントリによって決定されます。イン レコードの場合 (オプション 1/2 でアウトが空)、アウト エントリになります。