如何在日期链接表上创建唯一键

时间:2015-02-05 10:15:28

标签: mysql sql database-design unique-constraint

我有两个表:employee和子表employeeVacation

雇员

id
employeeName

employeeVacation

employeeId
vacationStartDate
vacationEndDate

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

是否有更好的方法来构造这两个表,以便可以在employeeVacation表上创建一个唯一的密钥(或它是等价的)?我正在寻找防止日期重叠的独特键或结构变化。

我想避免的这种重叠的例子:

第1行

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

第2行

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

我能想到的最好是employeeId&上的唯一键。 startDate

几年来一直在挠头,仍然想不到一个,所以会感激任何帮助!

1 个答案:

答案 0 :(得分:1)

您无法使用给定的数据模型加上一些唯一约束来解决此问题,因为范围 是唯一的,但是没有说明它们是否重叠。

有两种可能的解决方案:

  1. 您可以编写BEFORE INSERT触发器(也可能是更新前触发器)而不是唯一约束,它使用查询来检查是否存在重叠记录以便在出现情况时引发异常。它取决于dbms是否支持此功能。

  2. 您可以让您的模型更复杂,以便处理数天。然后“唯一” 意味着“不重叠”。

  3. 主键加粗:

    • 员工( empno ,姓名)
    • 度假( empno,vacationno ,状态)
    • 休假日( empno,vacationno,day

    你可以没有连接假期表:

    • 员工( empno ,姓名)
    • 休假日( empno,日

    或者使用基于ID的数据库(其他唯一键斜体):

    • 员工( id_employee empno ,姓名)
    • 休假日( id_vacationday 日,id_employee

    使用基于ID的数据库方便的休假表,您可能必须引入冗余,如果您希望dbms保证一致性(基于ID的系统通常就是这种情况):< / p>

    • 员工( id_employee empno ,姓名)
    • 休假( id_vacation ,id_employee,状态)
    • 休假日( id_vacationday ,id_vacation, day,id_employee

    你知道,尽管假期提到了隐含的陈述,你仍然需要假期里的id_employee。但是,某些dbms允许您对视图具有唯一约束,因此您可以加入休假和休假日并在(vacationday.day,vacation.id_employee)上设置唯一约束,这样您就可以在没有冗余问题的情况下下车。 / p>