1

我如何设计一个 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 分钟制作一个表格,因为我不知道我的时间粒度。

我非常愿意更改数据库结构,并添加新字段来完成这项工作。

4

2 回答 2

1

如果您认为查询log表的成本很高,您可以制作一个快照表,该表将捕获每个队列中的记录数,例如每天。在每天结束时向该表中插入新行。因此,要随时找出数字,您只需将当天这段时间内的更改应用于前一天结束时拍摄的快照。如果你索引表change_date中的列,log我认为这个查询会运行得很快。

于 2013-06-06T20:20:27.920 回答
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 函数听起来像是正确的工具。这假设旧状态和新状态永远不会相同。也许你可以应用类似的东西。

于 2013-06-06T02:22:08.647 回答