【问题标题】:Database Table Relationships having foreign keys in both child and parent table数据库表关系在子表和父表中都有外键
【发布时间】:2017-04-04 14:54:19
【问题描述】:

假设我们有两个表 CUSTOMER 和 VEHICLE 具有一对多的关系。 VEHICLE 有一个 CUSTOMERID 作为外键,这使它成为一个子表。问题是,为什么我不能将 VEHICLEID 作为 CUSTOMER 表的外键。我知道这是不正确的方法,但我需要更详细和深入地了解它不正确的原因

【问题讨论】:

    标签: database-design


    【解决方案1】:

    您可以,这是建模一对多关系的常用方法,其中一个孩子是“特殊的”。

    由此产生的循环依赖(以及插入新数据时的先有鸡还是先有蛋的问题)可以通过将 FK 之一设为 NULL 或将其执行推迟到事务结束(如果您的 DBMS 支持延迟约束)来解决)。

    【讨论】:

    • 感谢您的回答。我只是想要第二个意见,很高兴知道我想的解决方案不是“错误”的,它只是一个“特殊”案例,最好避免使用更简洁的设计。
    【解决方案2】:

    因为您将只能为每个客户添加一辆汽车...例如逐行添加一个汽车 ID...一行 = 一张表中的一位客户!

    您的第一个外键完成了外键所做的所有工作。不需要另一个外键反转! 2 交叉外键将无法在两个表中创建插入...

    【讨论】:

    • 嗯,您关于插入变得不可能的论点很有道理,但是如果我也向客户表添加一个外键并使其可以为空。
    【解决方案3】:

    可以,您只需要了解表之间的关系类型即可。是1-1吗? 1-许多?很多很多?一位客户可以只有一辆车,还是可以拥有不止一辆?如果一个客户可以拥有多于一辆车,那么正如您所描述的,这是一种一对多的关系。

    另一方面,如果客户表中有车辆 FK,那么您是说每辆车可以有多个客户,这可能不符合您的要求。

    或者它可能是多对多关系,其中一个客户可以拥有多辆汽车,并且每辆汽车都可以与多个客户相关联。在这种情况下,您需要一个带有一对 FK(一个 customerID,一个 vehicleID)的 customerVehicle 表。


    在回复您的评论时,您确实需要说明您的要求,或者您想要做什么。您可以随心所欲地实施您的密钥,在部署之后,如果您没有做您需要做的事情,它将失败。

    一对一的关系总是可以用一张表来表示,所以如果这是您的要求,即一个客户只能拥有一辆其他客户无法拥有的车辆,那么您根本不需要相关的车辆表.车辆表中的所有字段都可以移动到客户表中。

    【讨论】:

    • 好的。那么如果我向 Customer 表添加一个外键并对其实施唯一约束呢?这就引发了另一个问题,我们如何强制执行一对一关系,如果我们可以强制执行一个记录 par 表,那么为什么我们不能将外键 (VEHICLEID) 添加到父表 (CUSTOMER) 并强制唯一性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多