Database design 如何处理发票应用程序中的价格波动? < P>在发票应用程序中,考虑以下事项:

Database design 如何处理发票应用程序中的价格波动? < P>在发票应用程序中,考虑以下事项:,database-design,invoice,Database Design,Invoice,我有一个产品表,其中也包含产品的价格。然后,我有一个发票和发票行表,在每个发票行中,我参考产品id和数量。在这种情况下,我不使用发票行存储产品的价格 几个月后的今天,如果产品价格发生变化,任何报告都会显示基于当前价格的销售额,而不是产品实际销售价格 我想到的一个解决方案是,我们保留一个单独的名为prices的表,该表链接到每个产品,并且每当产品的价格发生变化时,都会在这个prices表中插入一条记录。此表中的最新记录始终被视为新发票的当前价格。每个发票行通过指示价格id来指示其价格,以便在以后的

我有一个产品表,其中也包含产品的价格。然后,我有一个发票和发票行表,在每个发票行中,我参考产品id和数量。在这种情况下,我不使用发票行存储产品的价格

几个月后的今天,如果产品价格发生变化,任何报告都会显示基于当前价格的销售额,而不是产品实际销售价格

我想到的一个解决方案是,我们保留一个单独的名为prices的表,该表链接到每个产品,并且每当产品的价格发生变化时,都会在这个prices表中插入一条记录。此表中的最新记录始终被视为新发票的当前价格。每个发票行通过指示价格id来指示其价格,以便在以后的报告中正确显示


处理此类情况的最佳做法是什么?

在发票行中添加一个价格字段。

我将始终针对每个订单项存储购买时的实际名称、数量和价格,从而有效地使数据非标准化。订单是时间上的快照,不应该与可以更改的内容联系起来。不仅价格会波动,而且如果您删除或重命名原始产品,并且您的发票又与之相关,会发生什么情况?

我同意您的建议:将价格分为以下几列,并单独列出:

PriceId、ProductId、Price、StartDate、EndDate

这样,您还可以提前计划未来的价格变化。当前数据可以使用(Sql Server语法)获取:


是的,同意。我会将产品的当前价格存储在产品表中,以及发票行上销售时的价格。我也这么做了很长时间,因为我在这两个地方都有采购表和销售表。我必须保持价格。但这是最好的解决办法吗?这种方法的另一个优点是,您可以捕捉到发票上可能永远不会出现的价格变化。您能与db详细说明吗结构。
SELECT *
FROM Products
   Inner Join Prices ON Products.ProductId = Prices.ProductId 
      And GetDate() Between StartDate and EndDate