如何规范使用月份的调度系统的数据



我是一名在非营利组织工作的学生,该组织希望为日程安排系统和MYSQL数据库提供一个网络平台。我对数据库不太了解,但我正在学习。时间表如下:志愿者安排下个月的轮班(如果可能的话,下个月)。目前,我们有6个表:Users、LastMonth、CurrentMonth、NextMonth、MonthAfterNext和ShiftProposals。

  • 用户有以下信息:UserID(这是主键)、First ame、LastName、Email、Hash、Salt、SkillLevel和(培训、InHouse等日期)

  • LastMonth/CurrentMonth/NextMonth/MonthAfterNext具有相同的以下键:Day(主键)、UserID和Shift(每天4班,因此为1-4班)。

  • ShiftProposals包含CurrentMonth的所有提案,这些提案在放入生成的时间表之前需要经过调度算法。

问题在四个时间表中。在数据库中,它们的格式与我们查看日历月份的方式相同。每个志愿者每月可以工作1到5个班次。除非另有安排,否则轮班计划将从上个月开始。

我们是否应该将4个月的表格合并为1?如果我们把它们做成一张表,主键是什么?当志愿者每月有多个轮班时会发生什么?

在数据库中,最好使用盲键。例如,我会将User表更改为:

User
----
User Number
User ID
Last Name
First Name
Email
Password Hash
Skill Level
...

这个想法是,所有与用户有关的东西,并且只有一个用户在这个表中。用户编号是一个自动递增的整数,将用作与用户相关的表的键的一部分。用户ID应该是唯一的索引,但不是主键。这样,如果您需要更改用户的用户ID,您可以在一个位置进行更改。没有人看到或知道用户号码是什么。用户编号仅用于将数据库表绑定在一起。

密码salt不应作为列存储在名为salt的数据库中。您将泄露密码哈希的一半密钥。它应该类似于与用户ID连接的姓氏。

你提到了多次约会,比如培训和内部约会。每当你有一个倍数的东西,你创建一个单独的表。你没有提供足够的信息让我给这张表起一个好的、描述性的名字。

Training
--------
Training Number
User Number
Training Type (In-house, Outside, etc.)
Training Date

Training Number是一个自动递增的整数。User Number是返回到User表的外键。

是的,你可以把Shift调成一张桌子。您也可以将Shift和ShiftProposals作为两个表。这是Shift作为一张桌子。

Shift
-----
Shift Number
User Number
Shift Time Stamp
Shift Code (1 - 4)
Shift Length
Proposed Boolean

Shift Number是一个自动递增的整数。用户号码是一个外键。

轮班时间戳是一个时间戳,给出轮班的完整日历日期,以及指示轮班开始的时间分量。此列以及"偏移长度"列使您可以灵活地创建半偏移甚至四分之一偏移。否则,列会记录轮班开始和结束的时间。"用户编号"、"偏移时间戳"(降序)和"偏移长度"构成另一个唯一索引。

Proposed Boolean标记是否建议移位(true)。如果创建两个表,则不需要此布尔值。

我希望这足以让你开始。创建关系数据库时,需要定义关系。这称为数据库规范化。

最新更新