【问题标题】:MySQL: How to keep history of an item?MySQL:如何保留项目的历史记录?
【发布时间】:2018-02-06 08:55:17
【问题描述】:

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

场景:

  1. 卖家创建了一个价格为 5 美元且名称为“foo”的商品
  2. 买家购买商品,创建一个链接到该商品 ID 的订单
  3. 稍后,卖家将商品名称更新为“foobar”,商品价格更新为 6 美元
  4. 买家查看订单历史记录。商品名称应该是“foo”,价格应该是 5 美元,因为这是他们购买的,但它们分别是“foobar”和 6 美元

发生这种情况是因为当卖家更新商品时,他们正在更新与订单相关的同一商品。

我想到了 3 种可能的解决方案来解决这个问题,我想请您谈谈您认为最好的解决方案(可能来自您之前的经验),或者我还没有想到的更好的解决方案。这是我第一次处理这种情况,所以不知道如何最好地进行而不需要稍后进行重构。

我的解决方案:

  1. 使项目名称和价格不可变。
    • 糟糕的用户体验,因为现在用户必须删除项目并重新创建它才能进行修改
    • 需要某种类型的 deleted_at 列,以防用户希望在购买后删除该项目,以便我仍然可以保留它以供以后参考以获取历史数据
  2. 为历史目的创建第二个表
    • 不可怕,但需要另一个名称不同的表,不是这个想法的忠实拥护者
    • 可能必须运行两次查询以检查两个表中的相似数据,而不是只查询一个表
  3. 在同一个表中创建两条记录,并标记一个布尔标志或其他标志以区别于历史/当前记录
    • 我最喜欢这个,但不确定布尔标志是否会对性能产生负面影响

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

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

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

    这似乎与“不要存储冗余数据”的理念背道而驰,但这并不是多余的——事实上,客户在特定日期以特定价格购买了产品,这仍然是有用的永远的事实,即使该产品的当前价格发生变化。

    仍然应该有一个指向原始产品表的链接,例如,管理人员可以跟踪每个产品包含多少订单。但是product表中的当前价格不影响每个客户的订单记录。

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

    在这个设计中:

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

    【讨论】:

    • 嗯,谢谢你的回答,在我问这个问题并认为由于某种原因这是一个不好的方法之前,我实际上已经像这样实现了它。我在想可能有另一种方法,但也许这是最理想的方法。
    • 嘿,快速提问,以ProductHistory 表为例,您是否还创建了UserProductHistory 和所有其他数据透视表,就像您可能拥有ProductUserProduct 表一样关系的目的,或者你只是回收了UserProduct等的历史和非历史表?
    • 在我从事的项目中,我没有。除了产品之外,没有要求保留对其他实体的更改历史记录。
    • 你们的产品有关系吗?就像用户创建产品时产品是否具有必需的“类别”一样,这意味着您有一个 ProductCategory 数据透视表以及您的 Product 表?这就是我的设置。有必要的关系,我只是想知道关系本身是否也应该在历史上保存,或者产品本身是否足够。但话又说回来,我想它确实取决于我自己的要求,在你的情况下,据我所知,你不需要保存关系数据,所以你没有。
    • 对。一般来说,不要实现不需要的东西。 :-)
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多