如何存储时间表?

时间:2011-09-04 22:26:17

标签: database algorithm

我正在开展一个必须存储员工时间表的项目。例如,一名员工的工作时间为周一至周四上午8点至下午2点以及下午4点至晚上8点。另一名员工可于周二至周六上午6点至下午3点工作。

我正在寻找一种算法或方法来将这类数据存储在MySQL数据库中。这些数据很少被访问,因此它不是重要的性能问题。

我曾考虑将其存储为字符串,但我不知道任何算法来“编码”和“解码”此字符串。

2 个答案:

答案 0 :(得分:2)

正如许多评论所指出的那样,将所有数据编码为对数据库基本无意义的字符串通常是一个不好的主意。通常最好定义数据元素及其关系,并在数据库中表示这些结构。 Wikipedia article on data models很好地概述了所涉及的内容(虽然它比你需要的更通用)。你所描述的问题看起来很简单,你可以用铅笔和纸做这件事。

开始的一种方法是记下问题中概念之间的逻辑关系列表。例如,列表可能如下所示(您的规则可能不同):

  • 每位员工都遵循一个时间表。
  • 每位员工都有名字和姓氏,以及员工ID。不同的员工可能具有相同的名称,但每个员工的ID对于该员工是唯一的。
  • 时间表包含一周的开始和停止日以及一天的开始和停止时间。
  • 计划的每一天的开始和停止时间都相同。
  • 有几名员工可能在同一时间表上。

由此,您可以列出规则中使用的名词。这些是数据库中实体(列)的候选者:

  • 员工
  • 员工ID
  • 员工名字
  • 员工姓氏
  • 附表
  • 安排开始日
  • 安排开始时间
  • 安排结束日
  • 安排结束时间

对于我列出的规则,时间表似乎独立于员工而存在。由于需要一种方法来确定员工遵循的计划,因此添加一个实体是有意义的:

  • 日程安排ID

如果你看一下规则中的动词(“跟随”,“有”等),你就会开始处理这些关系。到目前为止,我将所有内容分为两种关系:

Employees
    ID
    first_name
    last_name
    schedule_ID

Schedules
    ID
    start_day
    start_time
    end_day
    end_time

这似乎就是数据结构所需要的一切。 (对于Schedules表,start_dayend_day的合理替代方法将是一周中每一天的布尔字段。)下一步是设计索引。这是由您希望进行的查询驱动的。您可能希望查看以下内容:

  • ID = xyz的员工的日程安排是什么?
  • 周一中午谁在上班?
  • 哪些人没有人在工作?

由于员工和时间表由各自的ID唯一标识,因此这些应该是各自表的主要字段。您可能还希望拥有数据的一致性规则。 (例如,您不希望员工处于未定义的计划中。)这可以通过在Employees.schedule_ID字段和Schedules.ID字段之间定义“外键”关系来处理,这意味着Employees.schedule_ID应该编入索引。但是,由于员工可以共享相同的计划,因此它不应该是唯一的索引。

如果您需要按星期几和一天中的时间查看时间表,那么这些也可能值得编制索引。最后,如果您想按名称查找员工,也可以将这些字段编入索引。

答案 1 :(得分:-1)

假设您使用的是PHP:

将时间表存储在php数组中,然后使用serialize函数将其转换为字符串; 返回数组使用unserialize。 然而,这种记忆形式几乎从来都不是一个好主意。