Database 我的订单明细表只能有外键吗?

Database 我的订单明细表只能有外键吗?,database,database-design,foreign-keys,composite-primary-key,Database,Database Design,Foreign Keys,Composite Primary Key,以下是我的ERD部分: 如您所见,Order Details表中的OrderID继承自Orders表的OrderID。这同样适用于products表中的ProductID。我想我在某个地方读到,每个表都需要一个主键,但是这是例外吗 在任何情况下,您的订单明细表都不应仅使用FKS。这是一个彻底的灾难 订单详细信息必须记录下订单时的产品信息。例如,价格随时间而变化。您不希望过去的订单价格发生变化,因为价格在未来发生了变化 如果不及时的价格变化导致客户因未立即发货的产品而意外收取更多费用,这不仅会导

以下是我的ERD部分:


如您所见,Order Details表中的OrderID继承自Orders表的OrderID。这同样适用于products表中的ProductID。我想我在某个地方读到,每个表都需要一个主键,但是这是例外吗

在任何情况下,您的订单明细表都不应仅使用FKS。这是一个彻底的灾难

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

如果不及时的价格变化导致客户因未立即发货的产品而意外收取更多费用,这不仅会导致问题,而且还会完全破坏您报告销售信息的任何财务完整性,并可能向您的会计系统发送坏数据


订单和订单详细信息是时态数据。订单的所有内容必须在实际订单发出时记录下来。这不是非规范化,时态数据以不同的方式传递。

如果可以唯一地寻址表中的任何一行,则不需要主id。思考:我可以唯一地删除任何一行吗?如果答案已经是肯定的,并且没有其他理由需要额外的id,那么不要(orderid,productid)看起来是一个很好的自然候选密钥。它可以升级为主键。