【问题标题】:versioning each field vs history date field?版本化每个字段与历史日期字段?
【发布时间】:2011-04-26 12:42:10
【问题描述】:

您推荐哪个以及为什么?

我有几个表,当我对数据进行更改时......它应该转到具有生效日期的历史表(审计)。

另一种解决方案是在更改数据时对每个字段进行版本控制以插入新行?

发票信息的最佳方法是什么?商品名称和价格总是变化的

【问题讨论】:

    标签: mysql sql database database-design


    【解决方案1】:

    它们分别是slowly changing dimensionstype 2type 4

    这两种方法都有效,可能更适合您的需求,具体取决于您的模型和查询要求。

    基本上,type 2(版本控制)更适合您需要与当前值一样频繁地查询历史值,而type 4(历史表)更适合您更频繁地查询当前值时是针对最新值的更多查询(我的意思是要开发更多查询)。

    【讨论】:

    • 我有一个 order_items 来显示过去的订单。哪个更好?商品名称和价格的值总是变化的。
    • @user:通常(通常)历史记录表更好,因为您需要当前价格更重要,并且您需要针对它运行更多查询。这样,您就不需要在 isActive 或每个查询的类似字段上添加过滤器。
    • 我添加了版本字段,而不是历史表中的 DATE。表示例:item.version、item_history.version 和 order_table 表将包含版本号。所以我会得到 100% 准确的信息,而不是在日期搜索上转播。
    【解决方案2】:

    我们使用并满意的系统:
    每个需要历史的表,我们创建一个类似的表,并在末尾添加一个时间戳字段,这成为 PK 的一部分。
    对原始表的每次更新,我们以相同的条件插入历史表:

    update table x WHERE somthing something
    
    insert into table x_history 
    select * from x WHERE something something
    

    这可以让您的数据保持干净,并且让您的表格保持精简。

    【讨论】:

    • 这个方案的准确性没有问题吗?例如.. 显示历史表中的发票数据(旧数据).. 我希望它显示正确的价格 lol
    • 为什么会有问题?您可以使用版本控制,但它涉及更多我认为没有必要的逻辑/代码
    【解决方案3】:

    我个人的偏好是在您的应用程序中使用Observer Pattern 并实现一个单独的历史记录表。这意味着您可以在需要时从历史表中提取数据,并且不会影响查询主表的速度。

    【讨论】:

      猜你喜欢
      • 2020-06-24
      • 2021-08-22
      • 2021-08-08
      • 1970-01-01
      • 2018-03-23
      • 2011-06-05
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      相关资源
      最近更新 更多