在企业人事管理系统中,员工考勤数据存储是核心基础功能,需要覆盖打卡记录、请假申请、加班登记等常见业务场景,使用mysql作为存储数据库时,需要结合业务需求设计合理的表结构,保证数据的规范性和后续查询统计的效率。

需求分析与核心存储对象
员工考勤相关的存储需求主要包含三类核心对象,分别是员工基础信息、考勤规则配置、考勤业务记录,不同对象对应不同的存储表,避免数据冗余。
- 员工基础信息:存储员工姓名、工号、部门等固定属性,对应员工表
- 考勤规则配置:存储打卡时间要求、请假类型、加班计费规则等,对应考勤规则表
- 考勤业务记录:存储员工实际打卡、请假、加班的具体数据,对应考勤记录表
核心数据表结构设计
员工表 employee
存储员工的基础信息,作为考勤数据的关联主体,表结构如下:
CREATE TABLE `employee` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '员工ID', `emp_no` varchar(32) NOT NULL COMMENT '员工工号', `emp_name` varchar(64) NOT NULL COMMENT '员工姓名', `dept_id` int(11) NOT NULL COMMENT '所属部门ID', `position` varchar(64) DEFAULT NULL COMMENT '岗位名称', `entry_time` date NOT NULL COMMENT '入职时间', `status` tinyint(1) DEFAULT '1' COMMENT '状态 1在职 0离职', PRIMARY KEY (`id`), UNIQUE KEY `uk_emp_no` (`emp_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工基础信息表';
考勤规则表 attendance_rule
存储企业的考勤相关配置规则,方便后续扩展和调整考勤政策,表结构如下:
CREATE TABLE `attendance_rule` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '规则ID', `rule_type` varchar(32) NOT NULL COMMENT '规则类型 打卡/请假/加班', `rule_name` varchar(64) NOT NULL COMMENT '规则名称', `rule_content` text NOT NULL COMMENT '规则内容', `is_default` tinyint(1) DEFAULT '0' COMMENT '是否默认规则 1是 0否', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤规则配置表';
考勤记录表 attendance_record
存储员工的实际考勤业务数据,是考勤存储的核心表,表结构如下:
CREATE TABLE `attendance_record` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记录ID', `emp_id` int(11) NOT NULL COMMENT '员工ID', `record_type` varchar(32) NOT NULL COMMENT '记录类型 打卡/请假/加班', `record_time` datetime NOT NULL COMMENT '记录时间', `start_time` datetime DEFAULT NULL COMMENT '开始时间 请假/加班场景使用', `end_time` datetime DEFAULT NULL COMMENT '结束时间 请假/加班场景使用', `duration` decimal(10,2) DEFAULT NULL COMMENT '时长 单位小时', `remark` varchar(255) DEFAULT NULL COMMENT '备注信息', `status` tinyint(1) DEFAULT '1' COMMENT '状态 1正常 0异常', PRIMARY KEY (`id`), KEY `idx_emp_id` (`emp_id`), KEY `idx_record_time` (`record_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工考勤记录表';
常见数据操作示例
新增打卡记录
员工上班打卡时,向attendance_record表插入打卡类型的数据,示例语句如下:
INSERT INTO attendance_record (emp_id, record_type, record_time, remark) VALUES (1, '打卡', NOW(), '上班打卡');
查询某员工当月考勤记录
统计员工当月所有考勤数据,方便生成月度考勤报表,示例语句如下:
SELECT er.emp_name, ar.record_type, ar.record_time, ar.start_time, ar.end_time, ar.duration, ar.remark FROM attendance_record ar LEFT JOIN employee er ON ar.emp_id = er.id WHERE ar.emp_id = 1 AND DATE_FORMAT(ar.record_time, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') ORDER BY ar.record_time DESC;
统计部门月度考勤异常数据
查询某部门当月考勤状态为异常的记录,用于人事核对,示例语句如下:
SELECT er.emp_name, er.dept_id, ar.record_type, ar.record_time, ar.remark FROM attendance_record ar LEFT JOIN employee er ON ar.emp_id = er.id WHERE er.dept_id = 3 AND ar.status = 0 AND DATE_FORMAT(ar.record_time, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m');
存储优化建议
随着考勤数据量增长,可以从以下方面优化存储性能:
- 对
attendance_record表的emp_id和record_time字段建立联合索引,提升按员工和时间查询的效率 - 如果考勤记录量极大,可以按年度对
attendance_record表进行分表,降低单表数据量 - 定期归档超过1年的考勤历史数据到备份表,减少主表的数据存储压力