许多员工有很多课程都有到期日

时间:2018-03-15 00:18:16

标签: database ms-access database-design relationship table-structure

我正在寻找存储此信息的最佳方式。并非每门课程都有失效日期。

到目前为止,我发现的最简单的方法是:

tblEmployee
-----------
ID (pk)
Expiry1
Expiry2

tblCourseCatalog
----------------
CourseID(pk)
Name

对于tblCourseCatalog中的每个课程,在Expiry中创建一个新的tblEmployee以匹配tblCourseCatalog.CourseID

我试过:

tblCourseExpiryDates
--------------------
EmployeeID (pk) 1:1 with tblEmployee.ID
FirstAid
UnderWaterBasketWeaving

每次向tblCourseCatalog添加新课程时,都会在tblCourseExpiryDates添加一个新列以进行匹配。在尝试查询某些信息时,这变得棘手。我当前的方式(Expiry中的tblEmployee)是否因为tblCourseExpiryDates而改变了很多东西?对我来说,如果tblCourseCatalog.CourseID=2UnderWaterBasketWeaving)没有到期,那么拥有Expiry2列就是一种浪费。

1 个答案:

答案 0 :(得分:0)

存储此类内容的标准规范化方法是创建一个表,其中每行只查看一个课程员工组合,保存任何特定于该组合的数据,并且通常称为EmployeeCourse(或CourseEmployee)

~

您只在此表中放置实际有效日期的记录。对于没有日期的课程,没有员工会得到记录。如果给定的员工从未完成过课程,他们就不会记录。如果要删除日期,可以删除记录,或者只删除日期但保留记录(我可能会将其删除)。如果你想添加一个新课程,你只需将一条记录放入课程表中就可以了 - 你不需要改变任何其他内容。

当您需要查找记录时,需要使用外部联接加入表中,以便在主表中获得没有CourseEmployee记录的任何记录。

这个标准化数据的缺点是它确实使得在一行输出中获得员工的所有到期日期的列表变得更加困难 - 这是数据透视表进入的地方(我不确定他们是如何进行的)在访问中工作)。

如果您想了解更多相关信息,请查看数据库规范化。