Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 设计条件关系_Sql_Database_Database Design_Relational Database - Fatal编程技术网

Sql 设计条件关系

Sql 设计条件关系,sql,database,database-design,relational-database,Sql,Database,Database Design,Relational Database,我需要帮助设计我的数据库表 员工 Id EmployeeTypeId 员工类型 Id 名字 汽车 Id 雇员ID < >我如何强制只有一种类型的雇员(驱动程序)可以是汽车表中的外键,或者我应该重新设计表吗? < P>我认为前行数据库是一个好主意,这样就无法输入令人难以置信的数据。然而,在这里强制执行这一点有点棘手 解决方案1: 将EmployeeTypeId添加到Car表。然后将(EmployeeId,EmployeeTypeId)设为Employee表的外键(您可能需要在这两个字段上创建uni

我需要帮助设计我的数据库表

员工
Id
EmployeeTypeId

员工类型
Id
名字

汽车
Id
雇员ID


< >我如何强制只有一种类型的雇员(驱动程序)可以是汽车表中的外键,或者我应该重新设计表吗?

< P>我认为前行数据库是一个好主意,这样就无法输入令人难以置信的数据。然而,在这里强制执行这一点有点棘手

解决方案1:

将EmployeeTypeId添加到Car表。然后将(EmployeeId,EmployeeTypeId)设为Employee表的外键(您可能需要在这两个字段上创建uniqe约束,以便能够将它们用于外键引用)。然后在Car.EmployeeTypeId上添加一个约束,以确保它是一个驱动程序。我知道这看起来是多余的,但实际上没有问题,因为您不能在这里为员工分配另一个EmployeeType,所以一致性仍然是有保证的。不过,我承认这种方法有点笨拙

解决方案2:


在车表上插入跳跳虎之前,使用跳跳虎,查找员工并确保其为驾驶员,否则抛出异常。在我看来,这是一个更好的解决方案,仅就其简单性而言。然后,您可以向Car表中添加一列,其中包含您使用的类型的唯一名称,例如UniqueName='DRIVER',这样您就不必将ID用作幻数。你看,通常一个雇员类型和数据库中的另一个雇员类型一样好。如果要在某个条目上构建特殊的逻辑,则需要一个句柄。唯一名称是实现这一点的一种方法,标志IsDriver=TRUE/FALSE是另一种方法。

我认为这取决于您的rdbms。在Sql server中,不能仅使用外键约束,必须向Car表添加检查约束,以检查EmployeeType。其他数据库可能有其他解决方案。(例如,我知道MySql不强制执行检查约束,所以你必须想出一个不同的解决方案)。对我来说,这听起来像是一个业务规则,我倾向于将业务逻辑排除在数据库之外,并在业务层和/或CRUD操作中。另一方面,我希望数据库中有业务规则。一旦数据库阻止了不可信的插入,就不能犯导致数据不一致的错误。如果您错误地想要输入园丁为公司驾驶的汽车,您将得到一个例外。然而,在给定的星座图中实施这一点并不容易。在MS SQL中,您可以使用复选选项创建一个视图[VCar],并将其插入该视图而不是[Car]。如果汽车驾驶员必须参与许多特定关系,我最好创建子类型实体。关于触发器选项注意:员工更新时还需要触发器,以捕获此人不再是驾驶员,但仍然是从汽车中引用的。在外键中引用唯一约束不是一种不好的做法吗?如果不清楚,请抱歉。父表具有唯一的一列或一组列。cild表中的外键引用此列或这组列。