Mysql 库存历史-版本控制风格方法

Mysql 库存历史-版本控制风格方法,mysql,inventory-management,historical-db,Mysql,Inventory Management,Historical Db,处境 我正在为一个跟踪200000多个序列化设备的应用程序创建清单历史记录。我们的目标是能够及时回顾,准确地知道X日设备的位置 我认识到,理想的情况可能是在项目立即更改时触发更新历史记录的触发器,但是这将是一项规模非常大的任务,并且在当前应用程序中不容易实现 考虑到这一点,我们决定运行夜间脚本,检查当前库存,并将其存储到跟踪库存位置、状态等的库存历史表中。最初,我们每天都试图在历史上翻来覆去。即每天插入200000行,每5天产生超过一百万条记录。我们发现,这将在不到一年的时间内产生GBs的数据。

处境

我正在为一个跟踪200000多个序列化设备的应用程序创建清单历史记录。我们的目标是能够及时回顾,准确地知道X日设备的位置

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

考虑到这一点,我们决定运行夜间脚本,检查当前库存,并将其存储到跟踪库存位置、状态等的库存历史表中。最初,我们每天都试图在历史上翻来覆去。即每天插入200000行,每5天产生超过一百万条记录。我们发现,这将在不到一年的时间内产生GBs的数据。我建议的解决方案是在版本控制风格的历史记录中实现它。因此,与其每天插入200000条记录,不如只插入已更改的记录。并为已删除的记录插入已删除的记录

问题

这种方法有什么明显的问题吗?对于一个不是为历史而设计的已经构建的应用程序,是否有更好的替代方法? 如果这是一个好的方法,那么需要实现哪些我可能遗漏的东西?目前,我实施了以下场景: 如果不存在具有完全相同值的值,则插入。 如果当天未找到设备,则插入删除记录。 选择时,使用历史记录搜索允许的最新日期按设备id分组。如果我们想知道2014年1月1日的库存状态,请不要选择此后发生的任何记录,而是对记录进行分组,以便显示的是最新的记录。 注释


当我们查看历史记录时,有时需要了解特定设备,有时需要当天的库存汇总报告。

您可能需要创建两个历史记录表,第一个表快速确定与上次运行流程相比发生了哪些更改,第二个表跟踪库存更改的历史记录

第一个表是库存表的副本,它是上次运行此每晚、每天、每小时等流程时存在的。我会添加一个datetime字段来跟踪该进程上次运行的时间。此表与实际库存表一起使用序列号和相关字段位置、状态等确定插入、删除或更新的内容

第二个表是库存变更日志,表示序列XXX有多个条目。每当库存发生变化时,通过将上一个表中的记录复制到此表来填充此表。添加另一个字段:值为INSERT、UPDATE、DELETE的操作

伪代码:

填充插入和更新的步骤

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);
填充库存历史记录表:

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'

您如何知道记录何时更改?库存表中是否有一个字段,例如上次更新的库存?它将当前实际库存与当前历史库存进行比较。它比较了我们具体跟踪的值。地点、地位等等与我之前所说的相比,这样做的好处是什么?IE一个跟踪设备当天更新状态的表。@Tom-我假设您的一个表就是事务表,它会随着时间的推移而变大。另一个假设。对于夜间加工而言,每一张生长的桌子在决定什么改变时都可能成为瓶颈。因此,从考虑潜在瓶颈的过程开始。
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'