【问题标题】:Schedules and the database时间表和数据库
【发布时间】:2011-05-21 03:34:59
【问题描述】:

所以,我之前用 php 开发了一个员工调度系统。这是非常低效的。当我创建一个新的时间表时,我在一个名为“schedules”的表中生成了一行,并且对于受该时间表影响的每个员工,我在一个名为“schedule_days”的表中生成了一行,其中给出了该特定日期的开始和停止时间.此外,编辑时间表也很麻烦。在编辑页面上,我从特定时间表中从数据库中拉出每个用户并将其打印在页面上。这很合乎逻辑,但速度很慢。

您可以想象在为期一周的日程安排中加载大约 15 名员工需要多长时间。这将是 1 次查询计划,1 次查询每个用户,7 次查询每天为每个用户.. 如果我有 15 个用户,那就太多查询了。所以我只是问,其他人对做到这一点的最佳方式有何看法?

【问题讨论】:

  • 请注意,我维护的系统几乎与您的系统一模一样(不是我编写的),3 年后数据库又大又慢。因为必须预先生成时间表,所以在后台有一个工作会预先生成一年的数据,然后当有人切换他们的时间表时,需要删除整年的预先生成的数据,新的整体需要生成年数据,然后需要将旧计划中的异常映射到新计划。这是一场噩梦......

标签: php mysql database


【解决方案1】:

对于基于轮换的计划,您希望使用基于排除的系统。如果您知道员工 x 在日期范围 z 内轮换工作 y,那么您可以即时计算该员工的个人天数。如果他们生病/在课程中/等,请为当天的员工添加排除项。这将使数据库比每天跟踪每个员工要小很多。

table employee {EmployeeID}
table employeeRotations {EmployeeRotationID, EmployeeID, RotationID, StartDate, EndDate}
table rotation {RotationID, NumberOfDays, StartDate}
table rotationDay {RotationDayID, RotationID, ScheduledDay, StartTime, EndTime}
table employeeExceptions {EmployeeExceptionID, ExceptionDate, ExceptionTypeID (or whatever you want here)}

从那里,您可以编写一个函数,返回任何给定日期或任何给定周的 On/Off/Exception。

【讨论】:

    【解决方案2】:

    听起来您需要学习如何进行 JOIN,而不是为每个项目多次往返服务器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 2014-01-09
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多