为多个表创建外键约束

时间:2020-04-09 20:44:34

标签: sql-server database-design

我有一个名为ProjectList的表。我还有另外两个表,分别为EstimatesOrders

EstimatesOrders 的主键是ProjectList中的外键。首先创建ProjectList记录,然后创建Estimate记录,然后再创建Order记录。

如何在ProjectList中为EstimatesOrders创建外键约束,而又不违反 Order 外键约束?

我唯一能想到的就是在创建估算时创建一个空的订单记录。不确定这是否是一个优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

好吧,这里的根本问题是逻辑错误:您的数据库模型声称可以在项目存在之前进行项目估算和订购。
为了说明这一点,逻辑模型应该看起来像这样:

-- Project PRO exists.
--
project {PRO}
     PK {PRO}
-- Project estimate number EST_NO of project PRO exists.
--
estimate {PRO, EST_NO}
      PK {PRO, EST_NO}

      FK {PRO} REFERENCES project {PRO}
-- Project order number ORD_NO of project PRO exists.
--
order {PRO, ORD_NO}
   PK {PRO, ORD_NO}

   FK {PRO} REFERENCES project {PRO}

请注意如何无法在项目之前创建估算或订单。如果出于某些原因首选单列ID ,则可以将该示例修改为:

-- Project PRO_ID exists.
--
project {PRO_ID}
     PK {PRO_ID}

-- Project estimate identified by EST_ID
-- for project PRO_ID exists.
--
estimate {EST_ID, PRO_ID}
      PK {EST_ID}

      FK {PRO_ID} REFERENCES project {PRO_ID}

-- Project order identified by ORD_ID
-- for project PRO_ID exists.
--
order {ORD_ID, PRO_ID}
   PK {ORD_ID

   FK {PRO_ID} REFERENCES project {PRO_ID}

因此,您示例中的FKs被颠倒了。数据库设计全都与逻辑有关,它源于逻辑。尽管您可能会发现一些使用SQL技巧来解决可感知的技术问题的方法,但是仍然会保留潜在的逻辑错误(错误)。

注意:

All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key