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

Many employees have many courses which have expiry dates

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

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

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

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

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

我试过:

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

每当向 tblCourseCatalog 添加新课程时,都会向 tblCourseExpiryDates 添加一个新列以进行匹配。当试图查询一些信息时,这变得很棘手。我目前的方式(tblEmployee 中的 Expiry)是否比拥有 tblCourseExpiryDates 有很大改变?对我来说,如果 tblCourseCatalog.CourseID=2 (UnderWaterBasketWeaving) 没有过期,那么拥有 Expiry2 列是一种浪费。

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

EmployeeID
CourseID
ExpiryDate

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

当你需要查找记录时,你需要用外连接连接到table,这样你就可以得到主table中没有CourseEmployee记录的任何记录。

这种规范化数据的缺点是,它确实使得在输出的一行中获取员工的所有到期日期列表变得更加困难——这就是数据透视表 tables 出现的地方(并且我不确定他们在访问中是如何工作的。

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