【发布时间】:2017-04-04 14:54:19
【问题描述】:
假设我们有两个表 CUSTOMER 和 VEHICLE 具有一对多的关系。 VEHICLE 有一个 CUSTOMERID 作为外键,这使它成为一个子表。问题是,为什么我不能将 VEHICLEID 作为 CUSTOMER 表的外键。我知道这是不正确的方法,但我需要更详细和深入地了解它不正确的原因
【问题讨论】:
标签: database-design
假设我们有两个表 CUSTOMER 和 VEHICLE 具有一对多的关系。 VEHICLE 有一个 CUSTOMERID 作为外键,这使它成为一个子表。问题是,为什么我不能将 VEHICLEID 作为 CUSTOMER 表的外键。我知道这是不正确的方法,但我需要更详细和深入地了解它不正确的原因
【问题讨论】:
标签: database-design
您可以,这是建模一对多关系的常用方法,其中一个孩子是“特殊的”。
由此产生的循环依赖(以及插入新数据时的先有鸡还是先有蛋的问题)可以通过将 FK 之一设为 NULL 或将其执行推迟到事务结束(如果您的 DBMS 支持延迟约束)来解决)。
【讨论】:
因为您将只能为每个客户添加一辆汽车...例如逐行添加一个汽车 ID...一行 = 一张表中的一位客户!
您的第一个外键完成了外键所做的所有工作。不需要另一个外键反转! 2 交叉外键将无法在两个表中创建插入...
【讨论】:
可以,您只需要了解表之间的关系类型即可。是1-1吗? 1-许多?很多很多?一位客户可以只有一辆车,还是可以拥有不止一辆?如果一个客户可以拥有多于一辆车,那么正如您所描述的,这是一种一对多的关系。
另一方面,如果客户表中有车辆 FK,那么您是说每辆车可以有多个客户,这可能不符合您的要求。
或者它可能是多对多关系,其中一个客户可以拥有多辆汽车,并且每辆汽车都可以与多个客户相关联。在这种情况下,您需要一个带有一对 FK(一个 customerID,一个 vehicleID)的 customerVehicle 表。
在回复您的评论时,您确实需要说明您的要求,或者您想要做什么。您可以随心所欲地实施您的密钥,在部署之后,如果您没有做您需要做的事情,它将失败。
一对一的关系总是可以用一张表来表示,所以如果这是您的要求,即一个客户只能拥有一辆其他客户无法拥有的车辆,那么您根本不需要相关的车辆表.车辆表中的所有字段都可以移动到客户表中。
【讨论】: