如何设计存储表快照的关系数据库?

时间:2016-06-18 15:51:23

标签: mysql database database-design

我有以下表格:

  • 产品
  • 公司
  • 购买(有一家公司,有很多产品)

我需要能够根据以上3个表格创建发票。 我面临的问题是因为产品是可编辑的,所以可能会改变价格,从而使发票无效:购买时产品价格不再相同

我考虑过将总价存储在购买表上(这样我就可以获得购买的总价),但我需要在每个产品的基础上在发票上显示更精细的数据。

将公司与购买联系起来也会出现同样的问题。如果我需要将发票存储在桌子上,发票将始终反映最新数据,这并不理想。编辑产品将更改与已编辑的特定产品相关的每个存储发票。

当涉及基于多个度量的报告时,出现了第三个问题,这些度量都存储在不同的表中。如果我不断更新相关表格,我永远无法为某个时间点做出准确的报告。

我认为真正需要的是“时间旅行”。我考虑过几个选项:

  • 为每个表创建一个“快照”表,具有相同的模式等。然后,这些快照表将链接到我需要用于报告,开发票等的表。
  • 以上但使用相同的表格。具有parent_id的任何行都是快照。
  • 编辑产品时,请改为创建新产品,并保持原始状态不变。

这最后一个似乎是最糟糕的解决方案。这个问题叫做我面临的一般问题是什么?我怎么能去做呢?

**“链接”我是指使用外键设置关系。

3 个答案:

答案 0 :(得分:2)

解决这个问题的方法很简单,我每天都会处理价格,产品和发票。

创建一个product_price表,您可以在其中存储产品ID,当前价格和日期,以便您查看每个价格有效的时间段。因此,您将拥有一个产品到多个价格,每个价格都反映有效期。这样在存储发票而不是插入产品ID的表上,插入product_id_price。

同样适用于产品本身的任何属性,根据有效性注册更改。

报告时,您可以根据product_id_price或任何属性,在购买时关联产品和有效价格。

产品价格表中对日期的需求服从于需要重新定价价格或任何属性的历史演变。

如果您的产品随着时间的推移发生巨大变化,请在建模数据之前考虑业务逻辑。数据必须反映业务逻辑。话虽如此,我建议,并且我使用它,创建一个父母每个产品的总体家庭表,例如FORD FOCUS父母拥有福特福克斯这个名称的不同sku,但在某些属性上有所不同。

答案 1 :(得分:1)

只需在购买表中创建一个名为PurchaseSnapshot的新列,并插入所有可能在将来发生变化的必要值。不确定你的用户界面是什么样的,但你可以更改代码以轻松地取消快照值(价格),或者你可以将快照信息加载到一个简单的文本框中并用作参考

答案 2 :(得分:1)

听起来你想要做的就是版本化你的一些数据。版本控制的细节太长,无法在简单的答案中提供。 Here是我对类似问题的回答,其中包含我制作的幻灯片演示文稿的链接,其中包含有关如何设计表格和编写查询以检索数据的详细信息。

此方法列出的优点是过去和当前数据(以及将来的数据,如果使用的话)驻留在相同的表中,因此使用相同的查询来查看过去某个时间的数据或数据它在现在。此外,引用完整性与版本化数据的工作方式与非版本化相同。缺少版本化数据的外键一直是版本化的真正阻止。

看看这是否适合你。