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

标签 mysql database database-design

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

场景:

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

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

我想到了解决这个问题的 3 种可能的解决方案,我想听听您的想法,看看您认为最好的是哪一种(也许根据您之前的经验),或者是我还没有想到的更好的解决方案。这是我第一次处理这种情况,所以不确定在以后不需要重构的情况下如何最好地继续。

我的解决方案:

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

最佳答案

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

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

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

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

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

在这个设计中:

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

关于MySQL:如何保留项目的历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48633186/

相关文章:

database - Cakephp,不要使用数据库表

mysql - 创建数字和字母混合主键

php - MySQL (InnoDB) 的交易和订单安全

MySql - 为什么主键索引不够?

php - PDO 循环并打印 fetchAll

php - 排序计算数据以在 php 中对我的数据进行排名

database - 在 ORACLE 10.2g 中删除从 'SYS' 用户错误导入的模式对象?

javascript - 如何监控 Neo4j 的连接问题?

java - Hibernate 中的三元(和 n 元)关系

c# - 使用 LINQ 访问 FK 相关表中的信息