I'l*_*ack 6 mysql database logic database-design
我想开发员工时钟输入和输出系统(网站).
我担心两件事:
如果工作人员从昨天开始忘记"闹钟"并且今天有'时钟输入',那么它应该标记给经理.
工作人员可能会长时间工作,例如:时钟周一上午11:00到周二上午01:30(午夜后).我不希望系统认为工作人员已经忘记了时钟..
如何解决这个问题以及数据库设计可以改进哪些方面?
员工表:
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| password | varchar(50) | NO | | NULL | |
| hourly_rate | decimal(6,2) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
时钟表:
+----------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| staff_id | int(11) | NO | | NULL | |
| clock_in_date | datetime | NO | | NULL | |
| clock_out_date | datetime | NO | | NULL | |
+----------------+----------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
小智 5
你在这里开放的大量虫子是多么的交配.在为一家只做时钟系统的公司工作之后,这是我永远不想再做的事了!
我意识到我的回答是非常概念性的,并解决了问题正常范围之外的一些问题,但这是为了概述这类应用程序中的数据库设计和结构概念.这些信息来自我在该领域最近的专业发展,因此它不仅仅是假设,而是在实践中得到证实.
当你在看这种类型的系统时,你最好最初使用指标作为标志,这通常是打击的数量与比较每个记录.比较1000名员工的每条记录并不是最好的事情!
例如,如果用户在24小时内有8个拳(开始一天,早上休息开始,早上休息结束,午餐开始,午餐结束,下午休息开始,下午休息结束和一天结束),您可以确定它不太可能在这段时间没有错过拳和加班已经发生,但是如果在24小时期间(一天开始,早上休息开始,早上休息结束,午餐开始,午餐结束,下午休息开始和结束)有7次拳击当天)你知道一拳不见了,这个人忘记了当天的时间.请注意下午休息结束的时间.
然而,这不是完全证明并且仅提供指示性参考,您将需要将换班时间表与拳击比较以确保实际上没有错过.因为午餐结束和下午休息结束都可能错过了6个拳,你可以设置你的代码来标记那些不是该员工的X个拳头的任何东西.标记为您时,然后在该期间对该员工进行实际比较,以确定实际发生的事情和遗漏的内容.
这并不意味着你不会比较所有记录,但事情是根据员工的数量,它可能导致一些大问题在每条记录上进行精确比较,这是大多数员工使用通常更好的地方2台服务器,1台仅用于数据收集和接口,第二台用于运行比较流程.
正如我所提到的,对于这种类型的应用程序并使用不同的计划,您还需要查看保持班次计划以进行比较.您将希望为每位员工保留一份填充记录,该记录将在班次开始之前和班次结束之后给予相同的时间.这意味着超过一段时间的加班可能性将是最小的.基本的公式非常简单:班次中的小时数 - 24小时/ 2 =时间填充
现在,您可以在该用户的班次计划之前和之后放置时间填充.但是你仍然需要处理换班,换班或超过24小时轮班.这是它真正变得棘手的地方.您将需要查看一个重叠时间(填充,移位和打孔)的表格,然后可以对照计划的任何未来调整进行协调,因为事实变化在考勤时间并不少见.
现在,您还需要保留病假和假期的缺席时间表,这些数据通常需要在打卡/打卡表中进行标记,因为这是您的比较.当为一段时间设置一个标志时,可以跳过记录进行比较,并在报告中留下一个注释,而无需运行其他操作来检查它.
几乎在最后,请注意您是如何忘记正常的日期/时间约定来测量一系列变量的?更不用说在多个日期有效地工作了?因此,通常最好只使用开始和结束时间dd/mm/YYYY hh:mm:ss,测量使用UNIX时间来计算已经过了多长时间.在说要审计时,大多数系统都需要一个"日期戳"记录,因此在发布报告时可能需要对此进行服务器端处理.
最后,我还建议保留一个结果表,这将为每个用户提供报告结果,这样当您想要提供历史记录时,您可以动态生成文档,但是您不必浪费处理能力来每次比较记录要求提交报告.
我希望这有帮助!