MySQL:如何保存项目的历史记录?

时间:2018-02-05 23:29:26

标签: mysql database database-design

我有一个流程,其中我需要保留数据库记录信息的历史记录,但是用户需要能够随时更改它。

情境:

  1. 卖家创建一个价格为$ 5且名称为" foo"
  2. 的商品
  3. 买家购买商品,创建一个链接到该商品ID的订单
  4. 过了一会儿,卖家将商品名称更新为" foobar"和商品价格为$ 6
  5. 买方查看订单记录。项目名称应为" foo"价格应该是5美元,因为他们买了它,但他们是" foobar"和$ 6,分别
  6. 这是因为当卖家更新商品时,他们正在更新与订单相关的相同商品。

    我想到了这个问题的3个可能的解决方案,我想了解你认为哪个是最好的(可能来自你以前的经验),或者我还没有想到的更好的解决方案。这是我第一次处理这种情况,因此不确定如何在不需要重构的情况下继续进行。

    我的解决方案:

    1. 使商品名称和价格不可变。
      • 糟糕的用户体验,原因是用户必须删除项目并在需要进行修改时重新创建
      • 需要某种deleted_at列,以防用户想要在购买之后删除项目,以便我仍然可以保留它以便以后参考以获取历史数据
    2. 为历史记录创建第二个表
      • 并不可怕,但需要另一张名字不同的桌子,而不是想法的忠实粉丝
      • 必须运行两次查询以检查两个表中的类似数据,而不是只查询一个表
    3. 在同一个表中创建两个记录,并标记一个布尔标志或一些其他标志,以区别于历史/当前记录
      • 我最喜欢这个,但不确定布尔标志是否有任何负面的性能影响

1 个答案:

答案 0 :(得分:2)

我也遇到过这个问题,特别是在价格经常变化的产品目录中。或者由于某种原因,特定客户的价格可能会出售或打折。

我发现的唯一解决方案是在购买产品时将相关产品详细信息复制到客户的订单记录。在您的示例中,至少会复制产品名称和产品价格。

这似乎违背了“不存储冗余数据”的理念,但这并不是多余的 - 客户在特定日期以特定价格购买产品这一事实,这仍然是有用的事实上,即使该产品的当前价格发生变化,也是如此。

仍然应该有原始产品表的链接,因此管理人员可以跟踪每个产品包含的订单数量。但产品表中的当前价格不会影响每个客户订单的记录。

您可能还需要创建产品历史记录表,以记录价格或名称的所有更改时间。但这仅适用于历史记录保存,它不会影响购物或购买活动中的典型查询。

在这个设计中:

  • 产品表始终存储当前价格。
  • 当客户购买产品时,他们会将当前价格复制到自己的订单记录中。
  • 当经理更改价格时,应用会在ProductHistory表中创建新记录。
  • ProductHistory表中每个产品的最新记录与同一产品的当前价格相匹配。