当项目不断从队列移动到队列时,如何设计一个SQL数据结构,让我可以查询一个队列的大小(多少条记录)随着时间的推移(所以我可以绘制它)。
表:
Queue
--------------------------------------
item_id int
status enum('new','ready','old')
Log
--------------------------------------
item_id int
old_status enum('new','ready','old') --perhaps record new_status instead?--
change_date timestamp
每次项目更改状态(即新队列)时,我都会将其记录在日志中。
如何编写一个查询,告诉我“在10:00时,'新'中有X条记录,'准备'中有Y条等”。并且全天都这样做,所以我可以绘制它。
我不想每隔5分钟制作一张总表,因为我不知道我的时间粒度。
我非常愿意更改数据库结构,并添加新字段以使其正常工作。
答案 0 :(得分:1)
如果日志同时记录了新状态和旧状态,则可以向表中添加新的伪列,作为递增和减少每个状态的计数器:
SELECT
l.change_date
CASE WHEN l.new_status = 'new' THEN 1 WHEN l.old_status = 'new' THEN -1 ELSE 0 END AS new_count
CASE WHEN l.new_status = 'ready' THEN 1 WHEN l.old_status = 'ready' THEN -1 ELSE 0 END AS ready_count
CASE WHEN l.new_status = 'old' THEN 1 WHEN l.old_status = 'old' THEN -1 ELSE 0 END AS old_count
FROM log l
ORDER BY l.change_date
将伪列汇总到特定日期应该会为您提供该日期的活动计数。分析SUM函数听起来像是正确的工具。这假设旧状态和新状态永远不会相同。也许你可以应用类似的东西。
答案 1 :(得分:1)
如果您认为查询log
表的成本很高,您可以创建一个快照表,该表将捕获每个队列中的记录数,例如每天。在每天结束时,向此表插入新行。因此,要随时查找数字,您可以在当天的这段时间内将更改应用于前一天结束时拍摄的快照。如果您对change_date
表中的log
列编制索引,我认为此查询运行速度非常快。