场合
我正在为追踪超过200,000个序列化设备的应用程序制作库存历史记录。我们的目标是能够及时回顾并确切知道设备在X天的位置。
我认识到,当项目立即更改时,理想的情况可能是触发更新历史记录的触发器,但这将是一个非常大规模的任务,并且无法使用当前应用程序轻松实现。
考虑到这一点,我们决定运行一个夜间脚本来检查当前库存并将其存储到inventory_history
表中,该表跟踪库存的位置,状态等。最初,我们每天都试着在历史上尽情享受。 IE每天插入200,000行,每5天产生超过一百万条记录。我们发现这将在不到一年的时间内产生GB数据。我提出的解决方案是在版本控制样式历史中实现它。因此,不要每天插入200,000条记录,只插入已更改的记录。 (并为已删除的记录插入已删除的记录。)
问题(S)
备注
当我们查看历史记录时,我们有时想知道特定设备,有时我们想要当天的库存摘要报告。
答案 0 :(得分:1)
您可能希望创建两个历史记录表,第一个快速确定上次运行流程时发生的更改,第二个跟踪库存更改历史记录。
第一个表格是您上次运行此夜间(每日,每小时等)流程时存在的广告资源表格的副本。 (我会添加一个datetime字段来跟踪上次运行该进程的时间)。此表与您的真实库存表一起使用序列号和相关字段(位置,状态等)确定已被INSERTED,DELETED或UPDATED的内容。
第二个表是库存更改日志(表示SERIAL XXX有多个条目)。通过将上一个表中找到的记录复制到此表,每当库存更改时填充此表。添加另一个字段:带有值的ACTION(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);
删除:
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'