我正在开展一个必须存储员工时间表的项目。例如,一名员工的工作时间为周一至周四上午8点至下午2点以及下午4点至晚上8点。另一名员工可于周二至周六上午6点至下午3点工作。
我正在寻找一种算法或方法来将这类数据存储在MySQL数据库中。这些数据很少被访问,因此它不是重要的性能问题。
我曾考虑将其存储为字符串,但我不知道任何算法来“编码”和“解码”此字符串。
答案 0 :(得分:2)
正如许多评论所指出的那样,将所有数据编码为对数据库基本无意义的字符串通常是一个不好的主意。通常最好定义数据元素及其关系,并在数据库中表示这些结构。 Wikipedia article on data models很好地概述了所涉及的内容(虽然它比你需要的更通用)。你所描述的问题看起来很简单,你可以用铅笔和纸做这件事。
开始的一种方法是记下问题中概念之间的逻辑关系列表。例如,列表可能如下所示(您的规则可能不同):
由此,您可以列出规则中使用的名词。这些是数据库中实体(列)的候选者:
对于我列出的规则,时间表似乎独立于员工而存在。由于需要一种方法来确定员工遵循的计划,因此添加一个实体是有意义的:
如果你看一下规则中的动词(“跟随”,“有”等),你就会开始处理这些关系。到目前为止,我将所有内容分为两种关系:
Employees
ID
first_name
last_name
schedule_ID
Schedules
ID
start_day
start_time
end_day
end_time
这似乎就是数据结构所需要的一切。 (对于Schedules表,start_day
和end_day
的合理替代方法将是一周中每一天的布尔字段。)下一步是设计索引。这是由您希望进行的查询驱动的。您可能希望查看以下内容:
由于员工和时间表由各自的ID唯一标识,因此这些应该是各自表的主要字段。您可能还希望拥有数据的一致性规则。 (例如,您不希望员工处于未定义的计划中。)这可以通过在Employees.schedule_ID
字段和Schedules.ID
字段之间定义“外键”关系来处理,这意味着Employees.schedule_ID
应该编入索引。但是,由于员工可以共享相同的计划,因此它不应该是唯一的索引。
如果您需要按星期几和一天中的时间查看时间表,那么这些也可能值得编制索引。最后,如果您想按名称查找员工,也可以将这些字段编入索引。
答案 1 :(得分:-1)
假设您使用的是PHP:
将时间表存储在php数组中,然后使用serialize函数将其转换为字符串;
返回数组使用unserialize。
然而,这种记忆形式几乎从来都不是一个好主意。