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