6

現在、従業員の勤務開始時間と終了時間を表すテーブルがあります。

  • id_employee int
  • チェックイン日時
  • チェックアウト日時

従業員が終了したら、check_out を更新する必要があります。

次のような表が望ましいでしょうか。

  • id_employee int
  • date_event 日時
  • event_type varchar、値は CHECKIN または CHECKOUT です。

従業員がすでにチェックインしているかどうかを判断するには、特定の従業員の最後のレコードに CHECKIN の event_type があるかどうかを確認するだけです。また、レコードをフェッチして更新する必要がなくなりました。

2番目のアプローチの方が良いですか? または、他の提案はありますか?

4

6 に答える 6

5

いつも通り「場合による」。

オプション 1 は構築が簡単で、クエリも簡単です。チェックインしたがチェックアウトしなかった人を見つけるのは簡単なクエリです。各従業員の合計労働時間を見つけることも簡単です。このシンプルさは、おそらく、一般的なクエリのほうが高速になることを意味します。私が見る唯一の欠点は、拡張が難しいことです。たとえば、「昼休み」の別のイベント タイプをキャプチャする場合は、列を追加する必要があります。

オプション 2 はより柔軟です。スキーマを変更せずに新しいイベント タイプを追加できます。ただし、単純なクエリ (従業員 x が 6 月に何時間働いたか) は非常に扱いにくいものです。大幅な追加作業の柔軟性に対して支払います。

したがって、「より良い」とは何を意味するかによって異なります。

于 2012-09-28T11:27:13.640 に答える
3

形式 #2 の方が優れている理由は次のとおりです。

  1. このテーブルは単なるパンチ レコード エントリです。異常があっても問題ありません。
  2. たとえば、INTERVAL_OUT と INTERVAL_IN の 2 つのイベントをさらに導入したい場合など、このテーブルは拡張されます。2 番目の形式では、シンプルに保たれます。
  3. 可能であれば、event_type の代わりに event_type_id と別のテーブル event_type または単に定数配列を使用します。

    array_event_name = 配列 (1=>CHECKIN、2=>CHECKOUT、3=>INTERVAL_IN、4=>INTERVAL_OUT)

于 2012-09-28T09:28:49.997 に答える
1

ここで最初のオプションを選択します。両方のタイムスタンプを1行に配置すると、検索時間が長くなり、計算が簡単になります。

ある従業員の1日の労働時間を計算するとします。検索は一致する最初の行で停止し、必要なすべてのデータが得られます。オプション2の場合とは異なり、これ以上深く掘り下げる必要はありません。オプション1では、チェックイン/チェックアウトごとに1行だけを使用することで、テーブルサイズも縮小されます。

ただし、オプション2には1つの利点があります。チェックアウトするとき、データベースはオプション1のデータを更新するために検索を実行する必要があります。オプション2の場合、それは単なる書き込みです。

データを複数回検索するという事実を考慮すると、直接挿入の利点を放棄して、より良い構造とより高速な検索を得ることができます。最終的な選択はあなた次第ですが。

幸運を!

于 2012-09-28T13:35:59.503 に答える
1

私は2番目のものと一緒に行きます。

ただし、主要な質問とビジネス ルールは同じであり、どちらのアプローチでも回答できます。

于 2012-09-28T01:18:06.310 に答える
1

オプション1

最初のオプションを使用すると、データベース自体が異常からより適切に保護されます1。いくつかの異常はまだ可能性があります2が、それは始まりです。

一方、 InnoDB テーブルはクラスター化されており、クラスター化されたテーブルのセカンダリ インデックスは高価になる可能性があります (この記事の「クラスター化の欠点」を参照)。これは、クエリを実行する必要がある場合に考慮する必要がありますcheck_out

オプション #2

2 番目のオプションでは、データベース設計で純粋に宣言的に防止できる異常であっても、命令型コードに依存しています。

良い面としては、セカンダリ インデックスが必要になる可能性が低くなります。

選択

つまり、セカンダリ インデックスが必要でない限り、最初のオプションを使用してください。セカンダリ インデックスが必要な場合は、達成したいインデックス カバーの種類に応じて、いずれかのオプションを使用できます。


1最初のチェックインをせずにチェックアウトするなど。

2再チェックイン、最初のチェックアウトなし、「スティント」の重複など...

于 2012-09-28T03:23:12.563 に答える