我需要帮助设计我的数据库表。
员工
标识
EmployeeTypeId
EmployeeType
标识
名称
汽车
标识
EMPLOYEEID
如何强制只有一种类型的员工(驱动程序)可以成为Car表中的外键,还是应该重新设计表?
答案 0 :(得分:2)
我认为最好先装备数据库,以便无法输入难以置信的数据。然而,要在此强制执行此操作,有点棘手......
解决方案1:
将EmployeeTypeId添加到Car表。然后使(EmployeeId,EmployeeTypeId)成为Employee表的外键(您可能必须在这两个字段上创建uniqe约束,以便能够将它们用于外键引用)。然后在Car.EmployeeTypeId上添加一个约束以确保它是一个驱动程序。我知道这看起来多余,但它确实没有问题,因为你不能在这里为EmployeeType分配一个EmployeeType,所以仍然保证了一致性。不过我承认这种做法有点笨拙。
解决方案2:
在Car表上使用before-insert tigger,查找员工并确保它是驱动程序,否则抛出异常。在我看来,这是一个更好的解决方案,仅凭其简单性。然后,您可以向表Car添加一个列,其中包含您使用的类型的唯一名称,例如UniqueName ='DRIVER',因此您不必将ID用作幻数。你看,通常一个EmployeeType和数据库中的另一个一样好。如果要在某个条目上构建特殊逻辑,则需要一个句柄。唯一的名称是一种方法,标志IsDriver = TRUE / FALSE将是另一种。