【问题标题】:Creating foreign key constraints for multiple tables为多个表创建外键约束
【发布时间】:2020-04-09 20:44:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 什么是“空记录”?惯例是,要创建 PL 1st 使用空 FK。 (但带有 null 的设计总是有无 null 的等价物。)这是一个常见问题。 (显然。)请不要问重复的问题。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 这能回答你的问题吗? Nullable Foreign Key bad practice?

标签: sql-server database-design


【解决方案1】:

嗯,这里的根本问题是一个逻辑错误:您的数据库模型声称可以在项目存在之前进行项目估算和订单。
为了说明这一点,逻辑模型应该如下所示:

-- 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

【讨论】:

  • 问题中没有明确实体、关系和规则的确切含义。因此,没有证据表明某些问题实体不能先于其他实体存在,并且没有证据表明 FK 存在“错误”,因为 SQL FK 可以为空。重新反转 FK,“然后创建 Estimate 记录”听起来确实很可疑,但我们需要询问者的澄清。
猜你喜欢
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2014-12-12
相关资源
最近更新 更多