我有两个表: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
。
几年来一直在挠头,仍然想不到一个,所以会感激任何帮助!
答案 0 :(得分:1)
您无法使用给定的数据模型加上一些唯一约束来解决此问题,因为范围 是唯一的,但是没有说明它们是否重叠。
有两种可能的解决方案:
您可以编写BEFORE INSERT触发器(也可能是更新前触发器)而不是唯一约束,它使用查询来检查是否存在重叠记录以便在出现情况时引发异常。它取决于dbms是否支持此功能。
您可以让您的模型更复杂,以便处理数天。然后“唯一” 意味着“不重叠”。
主键加粗:
你可以没有连接假期表:
或者使用基于ID的数据库(其他唯一键斜体):
使用基于ID的数据库和方便的休假表,您可能必须引入冗余,如果您希望dbms保证一致性(基于ID的系统通常就是这种情况):< / p>
你知道,尽管假期提到了隐含的陈述,你仍然需要假期里的id_employee。但是,某些dbms允许您对视图具有唯一约束,因此您可以加入休假和休假日并在(vacationday.day,vacation.id_employee)上设置唯一约束,这样您就可以在没有冗余问题的情况下下车。 / p>