如何在链接 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
包含每个员工休假日期的详细信息。它在 employeeId
到 employee.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
我能想出的最好办法是 employeeId
和 startDate
上的唯一键。
几年来一直摸不着头脑,但仍然想不出一个,所以非常感谢您的帮助!
你不能用给定的数据模型加上一些唯一的约束来解决这个问题,因为范围 是 唯一的,但这并没有说明它们是否重叠。
有两种可能的解决方案:
您可以编写一个 BEFORE INSERT 触发器(也可能是一个 before update 触发器),而不是唯一约束,它使用查询来检查是否存在重叠记录以引发例外情况。这取决于dbms是否支持此功能。
你可以让你的模型更复杂,这样它就可以处理天数。那么"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) 具有唯一约束,这样您就可以在没有冗余问题。
我有两个 table:employee
和一个 child table employeeVacation
.
员工
id
employeeName
员工假期
employeeId
vacationStartDate
vacationEndDate
employee
包含员工列表,并且在 employeeName
列上有一个唯一键。
employeeVacation
包含每个员工休假日期的详细信息。它在 employeeId
到 employee.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
我能想出的最好办法是 employeeId
和 startDate
上的唯一键。
几年来一直摸不着头脑,但仍然想不出一个,所以非常感谢您的帮助!
你不能用给定的数据模型加上一些唯一的约束来解决这个问题,因为范围 是 唯一的,但这并没有说明它们是否重叠。
有两种可能的解决方案:
您可以编写一个 BEFORE INSERT 触发器(也可能是一个 before update 触发器),而不是唯一约束,它使用查询来检查是否存在重叠记录以引发例外情况。这取决于dbms是否支持此功能。
你可以让你的模型更复杂,这样它就可以处理天数。那么"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) 具有唯一约束,这样您就可以在没有冗余问题。