首页 文章

库存历史 - 版本控制样式方法

提问于
浏览
0

Situation

我正在为追踪超过200,000个序列化设备的应用程序制作库存历史记录 . 我们的目标是能够及时回顾并确切知道设备在X天的位置 .

我认识到理想情况可能是在项目立即更改时触发更新历史记录的触发器,但这将是一个非常大规模的任务,并且无法使用当前应用程序轻松实现 .

考虑到这一点,我们决定运行一个夜间脚本来检查当前库存并将其存储到一个跟踪库存位置,状态等的表中 . 最初,我们每天都试着在历史上尽情享受 . IE每天插入200,000行,每5天产生超过一百万条记录 . 我们发现这将在不到一年的时间内产生GB数据 . 我提出的解决方案是在版本控制样式历史中实现它 . 因此,不要每天插入200,000条记录,只插入已更改的记录 . (并为已删除的记录插入已删除的记录 . )

Question(s)

  • 这种方法有什么明显的问题吗?对于一个不是为历史而设计的已经构建的应用程序,是否有更好的替代方法?

  • 如果这种方法很好,我可能会遗漏哪些需要实施的方法?目前我实施了以下方案:

  • 插入,如果不存在,则具有完全相同的值 .

  • 如果当天未找到设备,则插入删除记录 .

  • 选择时,使用历史记录搜索允许的最近日期按设备ID分组 . (如果我们想知道2014年1月1日的库存状态,请不要选择之后发生的任何记录,而是将记录分组,以便显示的记录是最新的 . )

Notes

当我们查看历史记录时,我们有时想知道特定设备,有时我们想要当天的库存摘要报告 .

1 回答

  • 1

    您可能希望创建两个历史记录表,第一个快速确定从上次运行流程时更改的内容,第二个跟踪库存更改的历史记录 .

    第一个表是您上次运行夜间(每日,每小时等)过程时存在的 inventory 表的副本 . (我会添加一个datetime字段来跟踪上次运行该进程的时间) . 此表与您的真实库存表一起使用序列号和相关字段(位置,状态等)确定已被INSERTED,DELETED或UPDATED的内容 .

    第二个表是库存更改日志(表示SERIAL XXX有多个条目) . 通过将上一个表中找到的记录复制到此表,每当库存更改时填充此表 . 添加另一个字段:带有值的ACTION(INSERT,UPDATE,DELETE) .

    Pseudo code:

    填充插入和更新

    INSERT INTO inventory_transaction (serial_number,lastupdated,ACTION, location, status)
    SELECT inventory.serial_number, NOW()
      , IF(inventory_history.serial_number IS NULL, 'INSERT', 'UPDATE')
      , inventory.location
      , inventory.status
    FROM inventory
    LEFT JOIN inventory_history
      ON inventory.serial_number = inventory_history.serial_number
    WHERE NOT (inventory.location  <=> inventory_history.location
               AND inventory.status <=> inventory_history.status);
    

    删除:

    INSERT INTO inventory_transaction (serial_number, lastupdated, ACTION)
    SELECT inventory_history.serial_number, NOW(), 'DELETE'
    FROM inventory_history
    LEFT JOIN inventory
      ON inventory.serial_number = inventory_history.serial_number
    WHERE inventory.serial_number IS NULL;
    

    填充库存inventory_history表:

    TRUNCATE TABLE inventory_history;
    INSERT INTO inventory_history(serial_number,lastchecked, location, status)
    SELECT serial_number, NOW(), location, status
    FROM inventory;
    

    要查看在给定时间点库存的样子:

    SELECT inventory_transaction.*
    FROM (SELECT serial_number, MAX(lastupdated) as last_date
          FROM inventory_transaction
          WHERE lastupdated <= 'point in time'
          GROUP BY serial_number) AS correct_time
    JOIN inventory_transaction
      ON inventory_transaction.serial_number = correct_time.serial_number
        AND inventory_transaction.lastupdated = correct_time.lastupdated
        AND inventory_transaction.ACTION <> 'DELETED'
    

相关问题