我正在为我的办公室创建一个数据库。我们有大约200名员工。每位员工在被录用后2年内必须完成12门课程中的至少1门课程(每门课程的完成/资格日期不同,有些人已经在这里工作20年,有些人只有1年)才能获得资格。有些人已完成多门课程。每个课程都必须定期刷新(每个刷新周期不同,并根据最后的复习日期)。我在表的布局上遇到了麻烦。这是我的想法,但我想看看是否有一种不那么繁忙的方式来布局数据。我希望能够运行一个查询,告诉我哪个人已经完成了什么类(所以它必须查看所有3个类列)。我也想知道他们的资格何时失效,或者即将到来。到目前为止,我已经创建了一个员工数据表,如下表所示。
ID Name Class1 Class2 Class3 QualDt-Cl1 QualDt-Cl2 QualDt-Cl3 LstRequal1 ...
1 Bob Art Spanish 3/17/1989 9/12/2010 3/8/2012
2 Sally Math 8/31/2012
3 George Physics History 2/6/2005 7/6/1996
4 Casey History 6/8/2000
5 Joe English Sports Physics 12/10/1993 10/15/2001 4/22/2006
这些类列在他们自己的表中,每个类列都从中拉出来。根据最后的复习日期,合格日期复习将是查询中的计算列 有没有办法将一个人有资格的所有课程放在一个专栏中,并在另一栏中为每个特定的课程重新定位相关的日期?
答案 0 :(得分:0)
我认为如果每个科目都有一张桌子,并且在每个科目下注明人名,并且日期已经过去,那就不那么令人困惑了。
也可能有助于将表格从不合格的信息中删除,例如考试通过的确切日期,你可以做一个月,一年或者只是一年?如果李的方式是2年可能更有意义 - 也使得计算更容易。
如果您搜索每个主题,查询会有效吗?或谁有资格做本年度和下一年的主题。
顺便提一下,这不是一个问题,但希望答案有所帮助。
答案 1 :(得分:0)
在设计数据库时,每当您发现自己添加名称为Class1
,Class2
,Class3
的列时,您应该立即停下来思考是否更有意义名为Classes
的单独子表中的列,其中包含与父项的链接(关系)。这有几个原因,包括:
当有人选择第四门课时会发生什么?说“永远不会发生”会忽略这样一个事实:“从来就不是非常长时间”,我们都不能预测未来。
当检查某人是否参加了课程时,你真的需要检查(Class1 IS NULL) OR (Class2 IS NULL) OR (Class3 IS NULL)
并且真的单调乏味,这也意味着如果你做必须添加Class4
,然后必须更正所有SQL代码。
同样,如果你想找一个服用“心肺复苏术”的人,你必须寻找(Class1 = 'CPR') OR (Class2 = 'CPR') OR (Class3 = 'CPR')
的人。呸。
所以,省去一些麻烦(真的很麻烦)并创建一个Classes
表:
ID
ClassName
QualDate
(etc. )
...其中ID
是主表中的ID号(所谓的“外键”)。从您的示例数据中,您的Classes
表格如下所示:
ID ClassName QualDate
1 Art 3/17/1989
1 Spanish 9/12/2010
2 Math 8/31/2012
3 Physics 2/6/2005
3 History 7/6/1996
...