我是一名非盈利组织的学生,他们想要一个用于调度系统和MYSQL数据库的Web平台。我对数据库知之甚少,但我正在学习。安排工作如下:志愿者安排他们下个月的班次(如果可能的话,下一个月的班次)。目前,我们有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吗?如果我们确实将它们作为1个表,那么主键是什么?当志愿者每月多班次时会发生什么?
答案 0 :(得分: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是一个自动递增的整数。用户号码是返回用户表的外键。
是的,你可以让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)与否(false)。如果创建两个表,则不需要此布尔值。
我希望这足以让你开始。创建关系数据库时,可以定义关系。这称为database normalization。