mysqlでシンプルな勤怠管理システムのデータベース設計を実現
勤怠テーブルには、attence_id、employee_id、check_in、check_out の 4 つのフィールドが含まれている必要があります。これらのフィールドにはすべて厳密な型と制約が必要です。 employee_id は外部キー、attence_id は自動インクリメントされる主キーです。従業員テーブルには ENUM ステータス フィールドが追加され、インデックスが作成されます。 check_in/check_out は片側 NULL を許可しますが、完全に空にすることはできません。労働時間やステータスなどの派生値はリアルタイムで計算されなければならず、冗長なフィールドは禁止されなければなりません。 3 つの端のタイムゾーンを統一する必要があります。

勤怠テーブルには、 attendance_id 、 employee_id 、 check_in 、およびcheck_out
1 つは必須であり、そうでないと「パンチ タイムの計算」と「従業員のディメンション統計」をサポートできません。 check_inとcheck_out DATETIME型 ( DATEやTIMESTAMPではない) を使用する必要があります。そうしないと、昼休み後に 2 回チェックインする、複数日にまたがって残業するなどのシナリオでエラーが発生します。 ダーティ データを避けるために、 employee_id従業員テーブルに関連付ける外部キーとして設定する必要があります。 attendance_idは自動インクリメント主キーとして設定することが推奨されますが、UUID は推奨されません。挿入パフォーマンスが悪く、MySQL 8.0 より前の UUID のソート効率は非常に非効率的でした。
従業員テーブルはstatusフィールドを予約し、デフォルト値'active'を設定する必要があります。
実際の運用保守では、従業員が退職したが勤怠記録を残さなければならないという状況に遭遇することがよくあります。従業員の記録が削除されると、過去の勤怠記録は「ゴーストクロック」になります。無効化されているだけで削除されていない場合、 statusフィールドがなければ、コメントまたは追加のテーブル マークのみに依存することになり、確認するのが面倒でエラーが発生しやすくなります。
- スペルミスを防ぐには、
statusタイプにENUM('active', 'inactive', 'on_leave')を使用する方がVARCHARより安全です。 - インデックスを追加します:
CREATE INDEX idx_employee_status ON 従業員(ステータス);
- 当月の従業員の出席状況をクエリする場合は、テーブルに結合してフィルタリングしたり、サブクエリを書き込んだりせずに、直接
WHERE e.status = 'active'。
check_inとcheck_out NULL を許可しますが、ビジネス層はそれらのうち 1 つだけを空にできるように制御する必要があります。
早退、打刻忘れ、設備故障などはいずれも一方的な損失につながります。データベース レベルを強制的に空以外にすることはできません。そうでない場合、エントリは失敗します。ただし、両側を空のままにすることはできません。その場合、レコードは無意味になります。
- テーブルの作成時に次のように定義します。
チェックイン日時 NULL、チェックアウト日時 NULL
- トリガーまたはアプリケーション ロジックによるチェック:
check_in IS NULL AND check_out IS NULLは許可されません - 労働時間を計算するときは、
TIMESTAMPDIFF直接記述せず、最初に判断を追加します。IF(チェックインは NULL ではなく、チェックアウトも NULL ではありません、TIMESTAMPDIFF(HOUR、チェックイン、チェックアウト)、NULL)
「遅刻したかどうか」などの派生フィールドを出席シートに保存しないでください。
遅刻ルールは頻繁に変更され (柔軟な 15 分、休日の調整、部門の差別化など)、フィールドをハードコーディングするとルールが変更されるたびにALTER TABLEが完全に更新されるため、リスクが高く時間がかかります。
正しいアプローチは、ビューまたはクエリ時の計算を使用することです。
選択 *、
場合
WHEN TIME(チェックイン) > '09:15:00' THEN '遅刻'
ELSE '定刻'
END AS 出席状況
出席から
JOIN 従業員 e ON a.employee_id = e.employee_id;
複雑なルール (部門ごとに異なるパンチイン時間を設定するなど) の場合は、メイン テーブルのフィールドにルールを詰め込むのではなく、関連する構成テーブルを使用します。
実際のデプロイメント中に最も見落とされやすい側面は、タイム ゾーンの処理です。MySQL サーバー、接続クライアント、およびアプリケーション コードのタイム ゾーンが一致していないため、NOW()挿入時間が現地時間よりも数時間遅れる/早くなります。オンラインにする前に、必ずSYSTEMに設定するか、明示的に08:00指定してください。デフォルト値に依存しないでください。以上がmysqlでシンプルな勤怠管理システムのデータベース設計を実現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
ホットAIツール
Undress AI Tool
脱衣画像を無料で
AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。
Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ
Stock Market GPT
AIを活用した投資調査により賢明な意思決定を実現
人気の記事
人気のツール
メモ帳++7.3.1
使いやすく無料のコードエディター
SublimeText3 中国語版
中国語版、とても使いやすい
ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
ドリームウィーバー CS6
ビジュアル Web 開発ツール
SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)
ホットトピック
20572
7
13671
4
11996
4
9156
17
8543
7
mysql がインデックス プッシュダウンを通じて IO_IndexConditionPushdown の技術原則を削減する方法
Apr 21, 2026 am 10:56 AM
ICP はデフォルトで有効になっていますが、有効にするには条件を満たす必要があります。 InnoDB セカンダリ インデックスを使用する必要があり、WHERE にはインデックス内でプッシュ ダウンできる左端以外のプレフィックス フィールドが含まれており (ジョイント インデックス (a,b,c) の a=1ANDb>5 など)、条件は =、>、
root アカウントがローカルにログインできないという奇妙なエラーを mysql はどのように処理しますか_ローカルホストの解決と権限テーブルを確認してください
Apr 21, 2026 pm 02:26 PM
root が localhost 経由でログインできない主な理由は、'root'@'localhost' アカウントが権限テーブルにないか、認証プラグインに互換性がないことです。最初に SELECThost を確認し、localhost がない場合は userFROMmysql.userWHEREuser='root' を確認し、CREATEUSER で認証するか、ALTERUSER でプラグインを mysql_native_password に調整し、最後に FLUSHPRIVILEGES を行う必要があります。
mysql_Configure SELECT クエリ権限とライブラリレベルの制限で開発者に読み取り専用権限を付与する方法
Apr 21, 2026 am 11:02 AM
MySQL の読み取り専用権限は、SELECT を付与する前に、まず残りの書き込み権限 (INSERT、UPDATE など) を明示的に再利用する必要があります。それ以外の場合でも、権限の重ね合わせにより権限が変更される可能性があります。ホストへのログインを制限し、データベースごとの承認を付与し、information_schema の最小限のクエリ権限を追加し、更新後に検証を再接続する必要があります。
mysql はどのようにして CI/CD パイプラインのアカウントを作成し、自動デプロイメント用の専用のアクセス許可を割り当てますか?
Apr 25, 2026 pm 10:33 PM
MySQL の最小権限デプロイメント アカウントでは、root と ALLPRIVILEGES を無効にし、CI/CD で必要なオブジェクト レベルの権限 (flyway_schema_history テーブルの SELECT/INSERT/UPDATE、ビジネス テーブルで指定された DML、information_schema.SELECT など) のみを付与し、IP アクセスを制限し、caching_sha2_password プラグインの使用を強制し、パスワードを外部に挿入する必要があります。また、権限は次の方法で検証する必要があります。完全な展開プロセス。
mysql はディスク領域がいっぱいになった場合にどのように対処するか_mysql の領域拡張とクリーニング方法
Apr 21, 2026 am 10:51 AM
ディスクがいっぱいになったときに MySQL が停止した場合は、再起動ではなくバイナリログのクリアを優先し、その後で大きなファイルをチェックし、ログを閉じるなどする必要があります。 innodb_file_per_table=OFF の場合、ibdata1 は縮小できないため、エクスポートして再構築する必要があります。
mysql でユニオンとユニオンオールのどちらがパフォーマンスが高いか_一時テーブル メモリに対する重複排除操作の影響
Apr 21, 2026 pm 02:07 PM
UNIONALL のパフォーマンスは、重複排除のオーバーヘッドをスキップし、一時テーブルの作成、並べ替え、または比較を行わないため、UNION のパフォーマンスよりも大幅に優れています。一方、UNION は一時テーブルの作成を強制し、ディスク I/O をトリガーする可能性があるため、パフォーマンスが大幅に低下します。
MySQL スレーブ ディスク IO が高すぎる場合に最適化する方法_ログ更新戦略とシステム パラメーターを調整する
Apr 21, 2026 pm 02:21 PM
スレーブ ディスク IO が高い場合は、3 つのチューニング項目を優先する必要があります。set innodb_flush_log_at_trx_commit=2、sync_binlog=0 (log_slave_updates が有効でない場合) または 10、sync_relay_log=10000。同時に、マウントパラメータに noatime、nobarrier、commit=60 を追加します。
mysql_MySQL 権限制御権限管理でユーザーがパスワードを変更できないようにする方法
Apr 21, 2026 pm 02:34 PM
MySQL では、権限モデルには独立したスイッチが提供されていないため、ユーザーが自分のパスワードを変更することを直接禁止することはできません。考えられる解決策は、アカウントをロックし、ALTERUSER およびその他の権限を再利用し、外部のハードコードされたパスワードをクリーンアップすることです。





