如何在链接 table 的日期上创建唯一密钥

How to create a unique key on a date chained table

我有两个 table:employee 和一个 child table employeeVacation.

员工

id
employeeName

员工假期

employeeId
vacationStartDate
vacationEndDate

employee 包含员工列表,并且在 employeeName 列上有一个唯一键。 employeeVacation 包含每个员工休假日期的详细信息。它在 employeeIdemployee.id 列上有一个外键。此 table 中每个 employeeId 可以有多行。它没有唯一键。

是否有更好的方法来构造这两个 table,以便可以在 employeeVacation table(或等效项)上创建唯一键?我正在寻找防止日期重叠的唯一键或结构更改。

我想避免的重叠示例:

第 1 行

employeeId =1
startDate = 2015-01-01
endDate = 2015-02-15

第 2 行

employeeId =1
startDate = 2015-02-10
endDate = 2015-02-20

我能想出的最好办法是 employeeIdstartDate 上的唯一键。

几年来一直摸不着头脑,但仍然想不出一个,所以非常感谢您的帮助!

你不能用给定的数据模型加上一些唯一的约束来解决这个问题,因为范围 唯一的,但这并没有说明它们是否重叠。

有两种可能的解决方案:

  1. 您可以编写一个 BEFORE INSERT 触发器(也可能是一个 before update 触发器),而不是唯一约束,它使用查询来检查是否存在重叠记录以引发例外情况。这取决于dbms是否支持此功能。

  2. 你可以让你的模型更复杂,这样它就可以处理天数。那么"unique"是否意思是"not overlapping".

粗体主键:

  • 员工(员工号,姓名)
  • 假期(empno,vacationno,status)
  • 假期(empno,vacationno,day

你也许可以不用转机假期table:

  • 员工(员工号,姓名)
  • 假期(empno,天

或使用基于 ID 的数据库(附加唯一键斜体):

  • 员工(id_employee,empno,姓名)
  • 假期(id_vacationday天,id_employee

使用基于 ID 的数据库 方便的假期 table,如果您希望 dbms 保证一致性(这通常是基于 ID 的系统的情况):

  • 员工(id_employee,empno,姓名)
  • 假期(id_vacation、id_employee、状态)
  • 假期(id_vacationday、id_vacation、天、id_employee

你看,你仍然需要 id_employee in vacationday 在这里,尽管它是通过引用假期隐含说明的。但是,某些 dbms 允许您对视图具有唯一约束,因此您可以加入 vacation 和 vacationday 并对 (vacationday.day, vacation.id_employee) 具有唯一约束,这样您就可以在没有冗余问题。