我有一个名为ProjectList
的表。我还有另外两个表,分别为Estimates
和Orders
。
Estimates
和Orders
和 的主键是ProjectList
中的外键。首先创建ProjectList
记录,然后创建Estimate
记录,然后再创建Order
记录。
如何在ProjectList
中为Estimates
和Orders
创建外键约束,而又不违反 Order 外键约束?
我唯一能想到的就是在创建估算时创建一个空的订单记录。不确定这是否是一个优雅的解决方案。
答案 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