改进我当前的数据库设计以存储员工的日程安排

时间:2012-08-06 14:58:12

标签: php mysql database-design

我需要提出一种能够将员工的日程安排存储在数据库中的软件。我目前有这个设计:

 CREATE TABLE IF NOT EXISTS `schedules` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `employee_id` varchar(32) NOT NULL,
   `day_of_week` int(2) NOT NULL,
   `starting_time` time DEFAULT NULL,
   `ending_time` time DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

非常直接。打印今天的日期,找出一周中的哪一天,并从数据库中检索所有匹配项,但我想知道更好的方法来实现相同的目标。

我需要在日历上显示员工的日程安排,我需要将日期传递给日历才能显示。但是,如果我知道的唯一信息是特定员工将在周三工作,我就无法将日期传递给日历。

鉴于后一种数据库设计,有没有办法检索所有星期三或一个月/一年的星期一?

谢谢!

修改

我需要帮助倒退(或更好的替代方案)将一周中的某一天更改为实际日期。

这些是我的“限制”:

  • 我的日历控件需要一个日期才能在用户界面中显示“事件”。
  • 员工应该只提交一次他们的日程安排。

例如: John Doe每周一,周三和周五工作。 8:00-12:00。

使用我当前的数据库设计的信息以下列方式表示:

ID, employee_id, day_of_week, starting_time, ending_time
1, John Doe, 1, 8:00, 12:00
2, John Doe, 3, 8:00, 12:00
3, John Doe, 5, 8:00, 12:00

我需要能够将日期传递给给定月份的日历UI。

例如,我应该能够想出一种方法来告诉我的日历控件: John Doe将在6日,13日,20日和27日工作,考虑到我所拥有的唯一信息是“day_of_week”= 1(星期一)

编辑2

我目前但丑陋的解决方案是: 循环遍历该月的所有日期,并逐日查询数据库。

编辑3 - 解决方案

感谢RS,我能够解决我的问题。 我按原样保留了schedules表,但我创建了 rs 建议的表 创建 rs 共享的文章中描述的表格之后 以下查询完成了这项工作:

 SELECT CONCAT(users.firstname,\" \",users.lastname) as employee_name, 
 DATE_FORMAT(DATE, '%a %b %d %Y') as date, schedules.starting_time,
 schedules.ending_time FROM dates_d 
 RIGHT JOIN schedules ON schedules.day_of_week = dates_d.day_of_week
 LEFT  JOIN users ON schedules.employee_id = users.ID

我JSON编码了一个数组,而Calendar控件终于像魅力一样工作了。

2 个答案:

答案 0 :(得分:3)

您可以创建日期表并使用该表中的键并存储在此处。日期表允许您按不同的日期变量查询数据,例如:day, week, day of week, quarter等 - dwhworld.com/2010/08/date-dimension-sql-scripts-mysql

您的schedules表格会id, emplid, date_id,您可以schedulesdate schedules.date_id = datetble.date_id {{1}}表,并在一个查询中获取日期,星期几。然后,您可以将此日期字段与控件一起使用

答案 1 :(得分:1)

为什么不将 day_of_week 列改为日期类型,这样如果您希望从此日期开始,您可以使用MySQL的DayOfWeek功能。您可以使用相同的日期传递到您的日历控件(我认为这就是您所获得的内容)。

详细说明您的评论:John Doe计划工作的日期不会由用户输入(可能通过jQuery UI's datepicker),然后在UI级别呈现您的日程安排时,您将使用以下查询检索其星期一时间表:

SELECT * 
FROM schedules 
WHERE DAYOFWEEK(schedule_date) = 1
AND employee_id = (
    SELECT employee_id
    FROM employees
    WHERE employee_name = 'John Doe'
)

显然,这个查询会对您的员工表做出一些假设,但这并不是特别优雅,但它可以解释我的意思。

RE:编辑

好的,现在我明白了你的意思。基本上你是在一个函数之后,它会给你两个范围(也许)之间的所有日期,它们在指定的日期(比如说星期一)。这似乎是has already been done in PHP所以可能有用吗?或者确实需要特定的技术,这需要在吗?

编辑3

这似乎是一个更优雅的解决方案:Get mondays tuesdays etc - 从这里你可以在SQL中查询你的DayOfWeek并返回一个整数数组,你可以将它作为第三个参数传递给它们的函数。