【项目背景】
我现在需要帮助用户设计一个完整的员工考勤打卡系统的数据表结构。用户之前已经得到了一个业务逻辑架构方案,现在他需要更详细的数据库设计,包括所有相关的数据表和字段。
首先系统包括早班、中班、晚班等多个班次,每个班次的人员不同,打卡时间也不同。因此,核心模块应该包括员工管理、班次配置、排班管理、打卡记录、考勤结果等。
接下来,需要确定每个模块对应的数据表。根据业务逻辑层,员工管理模块需要员工表;班次配置模块需要班次表;排班管理模块需要排班表;打卡服务模块需要打卡记录表;考勤计算引擎需要考勤结果表。此外,可能还需要部门表、审批表、设备表、权限表等辅助表。
然后,每个表的详细字段需要考虑周全。比如员工表需要包含基本信息、部门、职位、是否排班人员等。班次表需要班次名称、上下班时间、迟到早退允许时间、是否跨天、有效打卡方式等。排班表需要员工ID、班次ID、排班日期,还要处理可能的冲突和周期性排班。打卡记录表需要用户ID、时间戳、位置信息、设备(电子工牌、考勤机)ID、打卡类型等。考勤结果表需要关联员工、日期、班次、上下班打卡时间、状态、工时等。
还要考虑特殊场景,比如跨天班次如何处理,可能需要记录日期和时间的完整时间戳。补卡审批流程需要审批表来记录申请信息、审批状态和时间。设备管理表用于验证合法设备,防止作弊。权限表用于控制不同角色的访问权限。
另外,数据一致性和性能优化方面,可能需要使用Redis缓存班次和排班信息,分库分表处理打卡记录,使用索引加快查询速度。安全方面,打卡照片加密存储,设备指纹和IP校验。
需要确保所有表之间的关系正确,比如员工与部门的外键关联,排班表与员工和班次的外键关联,打卡记录和考勤结果与员工的关联等。同时,字段的数据类型要合适,比如时间字段用DATETIME,地理位置用DECIMAL存储经纬度,状态字段使用ENUM类型。
可能还需要考虑未来的扩展性,比如规则引擎可能需要单独的规则表,但目前用户可能只需要基础结构。此外,审批流程可能需要更多字段,比如审批人、备注等,但用户现在可能只需要基础审批表结构。
最后,检查是否有遗漏的表或字段,比如部门表、设备表、权限表是否必要。根据用户需求,这些都是支撑系统运行的基础表,应该包含在内。同时,考虑用户可能没有明确提到的需求,比如数据分析需要的统计表,但用户当前可能只需要核心表结构,统计可以通过视图或查询实现,暂时不单独建表。
总结下来,需要设计员工表、部门表、班次表、排班表、打卡记录表、考勤结果表、审批表、设备表、权限表,每个表详细字段和注释,确保覆盖所有业务需求,并保持扩展性和性能。
【数据表结构】
以下是完整的数据库表结构设计,包含核心业务所需的全部数据表及详细字段说明:
1. 员工基础表 (employee)
字段名 | 类型 | 说明 | 示例 |
---|---|---|---|
id | BIGINT(主键) | 员工唯一ID | 10001 |
name | VARCHAR(50) | 姓名 | 张三 |
dept_id | BIGINT | 所属部门ID | 201 |
position | VARCHAR(30) | 职位 | 前端工程师 |
is_shift_worker | TINYINT(1) | 是否参与排班(0否/1是) | 1 |
hire_date | DATE | 入职日期 | 2023-01-15 |
2. 部门表 (department)
字段名 | 类型 | 说明 |
---|---|---|
id | BIGINT(主键) | 部门ID |
name | VARCHAR(50) | 部门名称 |
parent_id | BIGINT | 上级部门ID(树形结构) |
3. 班次配置表 (work_shift)
字段名 | 类型 | 说明 | 示例 |
---|---|---|---|
shift_id | BIGINT(主键) | 班次ID | S001 |
shift_name | VARCHAR(20) | 班次名称 | 早班 |
start_time | TIME | 标准上班时间 | 09:00:00 |
end_time | TIME | 标准下班时间 | 18:00:00 |
allow_late_minutes | INT | 允许迟到分钟数 | 30 |
allow_leave_early_minutes | INT | 允许早退分钟数 | 15 |
cross_day | TINYINT(1) | 是否跨天(0否/1是) | 0 |
valid_checkin_types | VARCHAR(100) | 有效打卡方式(JSON数组) | ["GPS","Face"] |
4. 排班计划表 (schedule)
字段名 | 类型 | 说明 | 示例 |
---|---|---|---|
schedule_id | BIGINT(主键) | 排班记录ID | |
emp_id | BIGINT | 员工ID(关联employee.id) | |
shift_id | BIGINT | 班次ID(关联work_shift.shift_id) | |
schedule_date | DATE | 排班日期 | 2024-03-20 |
is_working_day | TINYINT(1) | 是否工作日(0休息/1工作) | 1 |
5. 打卡记录表 (checkin_record)
字段名 | 类型 | 说明 | 示例 |
---|---|---|---|
record_id | BIGINT(主键) | 打卡记录ID | |
emp_id | BIGINT | 员工ID | |
checkin_time | DATETIME(6) | 精确打卡时间(支持毫秒) | 2024-03-20 08:55:23.456 |
checkout_time | DATETIME(6) | 下班打卡时间 | 2024-03-20 18:10:12.345 |
location_lat | DECIMAL(10,6) | 纬度 | 31.230416 |
location_lng | DECIMAL(10,6) | 经度 | 121.473701 |
device_fingerprint | VARCHAR(64) | 设备指纹(防作弊) | 2a3b4c5d... |
checkin_type | ENUM('GPS','WiFi','Face','Card') | 打卡方式 | Face |
photo_url | VARCHAR(255) | 现场照片URL(加密存储) | /secure/face_123.jpg |
6. 考勤结果表 (attendance_result)
字段名 | 类型 | 说明 |
---|---|---|
result_id | BIGINT(主键) | 考勤结果ID |
emp_id | BIGINT | 员工ID |
check_date | DATE | 考勤日期 |
shift_id | BIGINT | 应出勤班次ID |
actual_checkin | DATETIME | 实际上班打卡时间 |
actual_checkout | DATETIME | 实际下班打卡时间 |
late_minutes | INT | 迟到时长(分钟) |
early_minutes | INT | 早退时长(分钟) |
attendance_status | ENUM('正常','迟到','早退','缺卡','旷工') | 考勤状态 |
work_hours | DECIMAL(4,1) | 实际工时(小时) |
7. 补卡审批表 (attendance_apply)
字段名 | 类型 | 说明 |
---|---|---|
apply_id | BIGINT(主键) | 申请ID |
emp_id | BIGINT | 申请人ID |
apply_type | ENUM('补卡','请假','调休') | 申请类型 |
apply_date | DATE | 申请补卡日期 |
original_status | VARCHAR(20) | 原考勤状态 |
reason | TEXT | 申请理由 |
attach_url | VARCHAR(255) | 证明材料URL |
status | ENUM('待审批','通过','驳回') | 审批状态 |
approve_time | DATETIME | 审批操作时间 |
8. 设备管理表 (device)
字段名 | 类型 | 说明 |
---|---|---|
device_id | VARCHAR(32)(主键) | 设备唯一标识 |
device_type | ENUM('考勤机','手机','平板') | 设备类型 |
location | VARCHAR(100) | 设备安装位置 |
is_active | TINYINT(1) | 是否启用 |
9. 权限表 (permission)
字段名 | 类型 | 说明 |
---|---|---|
role_id | INT(主键) | 角色ID |
role_name | VARCHAR(20) | 角色名称(员工/部门经理/HR) |
can_edit_shift | TINYINT(1) | 是否可编辑班次 |
can_approve | TINYINT(1) | 是否有审批权限 |
关键索引设计
-- 排班表联合索引(快速查询员工某天排班)
CREATE INDEX idx_schedule_emp_date ON schedule(emp_id, schedule_date);-- 打卡记录时间范围索引(加速考勤计算)
CREATE INDEX idx_checkin_time_range ON checkin_record(checkin_time, checkout_time);-- 考勤结果状态统计索引
CREATE INDEX idx_attendance_status ON attendance_result(attendance_status);
特殊字段说明
-
地理位置存储:
-
使用
DECIMAL(10,6)
存储经纬度(精确到小数点后6位,约0.1米精度)
-
-
跨天班次处理:
-
在
work_shift
表中通过cross_day
标记 -
计算时判断
end_time < start_time
即为跨天班次
-
-
数据加密字段:
-
photo_url
采用AES加密存储 -
device_fingerprint
使用SHA256哈希存储
-
如果需要进一步说明表关联关系或提供DDL完整SQL脚本,请随时告知!
欢迎交流!