2011-09-04 63 views
0

我正在研究一个必须存储员工时间表的项目。例如,一名员工周一至周四的工作时间为上午8点至下午2点,下午4点至8点。另一位员工可能在星期二至星期六上午6点至下午3点工作。如何存储时间表?

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

我以为它存储为一个字符串,但我不知道任何算法来“编码”和“解码”这个字符串。

+0

请不要将其存储为“加密”字符串。 –

+0

我希望通过加密你的意思模式。 –

+0

也许他的意思是“编码”和“解码”? –

回答

2

正如许多评论指出的那样,将所有数据编码成基本上对数据库无意义的字符串通常是一个糟糕的主意。定义数据元素及其关系通常会更好,并在数据库中表示这些结构。​​是一个很好的概述(尽管它比你需要的更普遍)。你所描述的问题似乎很简单,你可以用铅笔和纸做这件事。

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

  • 每个员工都遵循一个时间表。
  • 每位员工都有名字和姓氏,以及员工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应该被编入索引。但是,由于员工可以共享相同的时间表,因此不应该是唯一索引。

如果您需要按星期几和一天中的时间查找时间表,那么这些也可能值得建立索引。最后,如果你想通过名字查找员工,那么这些字段也应该被编入索引。

+0

以外的操作。但是,通过此计划,您如何表示第一个示例(“星期一到星期一星期四从上午8点到下午2点,从下午4点到8点“)。开始日和结束日是好的,但要表示开始时间和结束时间,我需要在“日程表”表中使用2行,但“员工”只有一个日程表ID ...恐怕我们需要第三个表,真正? – Ivan

+0

也许如此。方法是一样的:从在域中应用的一组规则开始。显然,我使用的规则是:_“时间表有一周的开始和结束日期以及一天的开始和结束时间。”_不适用。你只需要做同样的事情:写下正确的规则,把名词变成实体,然后用动词定义关系,然后你就可以形成表格。诸如表示多对多关系等技术问题可能需要引入表格,这些表格在域名描述中并不明显,但在您完成整个过程时会自然而然地出现。 –

-1

假设你使用PHP:

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

+0

好的,但..我的问题是关于存储这种数据的方法。你如何将它存储在PHP中? – Ivan

+0

与你在mysql db中存储字符串的方式相同 – Simone

+0

50年的关系代数已被扫出窗口......我不会-1(为了结束语),但关系数据库是美丽的东西* when正确使用*。 – 2011-09-05 00:57:23