1

这里是我的ERD的部分: enter image description here我的订单明细表是否只有外键?

正如你可以看到,从Order Details表将订单从Orders表的订单ID继承。仅在产品表中的ProductID中也是如此。我以为我在某处读到每个表都需要一个主键,但是这是个例外吗?

+0

如果您可以唯一地寻址表中的任何一个特定行,则不需要主ID。想想:*我可以删除任何一个特定的行吗?*如果答案已经*是*,没有其他理由有额外的ID,那么不要。 – deceze

+0

(orderid,productid)看起来像一个优秀的*自然*候选键。它可以被提升为主键。 – wildplasser

回答

1

在任何情况下,您的订单明细表只能使用FKS。这是总灾难的秘诀。

订单详细信息必须记录订单时产品的信息。例如,价格随时间变化。您不希望过去的订单价格发生变化,因为价格在未来发生变化。

这不仅会导致问题,如果一个错误的价格变化导致客户意外收取更多的东西没有立即发货,但它会完全破坏您的信息财务完整性报告销售,并可能发送坏的数据到你的会计系统。

订单和订单详细信息是时间数据。关于订单的一切都必须记录在实际订单的时间。这不是非规范化,时态数据是不同的。